`

JAVA socket编程实例 [转]

阅读更多
(转载文章,原作者无从考证,感谢作者的无私奉献)
事实上网络编程简单的理解就是两台计算机相互通讯数据而已.对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了.Java SDK提供一些相对简单的Api来完成这些工作.Socket就是其中之一.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以准备网络编程了.
网络编程的基本模型就是客户机到服务器模型.简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系..然后完成数据的通讯就可以了.这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端.基于这个简单的模型,就可以进入网络编程啦.
Java对这个模型的支持有很多种Api.而这里我只想介绍有关Socket的编程接口.对于Java而言已经简化了Socket的编程接口.首先我们来讨论有关提供固定位置的服务方是如何建立的.Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你.
Java代码 复制代码 收藏代码
  1. ServerSocket server=new ServerSocket(6789);  
ServerSocket server=new ServerSocket(6789);
这里稍微要注意的是端口的分配必须是唯一的.因为端口是为了唯一标识每台计算机唯一服务的.另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的.好了.我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求.因此Java同样提供了一个Socket对象来对其进行支持.只要客户方创建一个Socket的实例对象进行支持就可以了.
Java代码 复制代码 收藏代码
  1. Socket client=new Socket(InetAddress.getLocalHost(),5678);  
Socket client=new Socket(InetAddress.getLocalHost(),5678);

客户机必须知道有关服务器的IP地址.对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供.它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法.
好了.上面的方法基本可以建立一条连线让两台计算机相互交流了.可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的.因为底层的网络是继续数据的.除非远程调用,处理问题的核心在执行上.否则数据的交互还是依赖于IO操作的.所以你也必须导入java.io这个包.java的IO操作也不复杂.它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写.
Java代码 复制代码 收藏代码
  1. BufferedReader in=   
  2. new BufferedReader(new InputStreamReader(server.getInputStream()));    
  3. PrintWriter out=new PrintWriter(server.getOutputStream());   
BufferedReader in=
new BufferedReader(new InputStreamReader(server.getInputStream())); 
PrintWriter out=new PrintWriter(server.getOutputStream()); 

上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作.而原始的字节流来源于Socket的两个方法.getInputStream()和getOutputStream()方.分别用来得到输入和输出.那么现在有了基本的模型和基本的操作工具.我们可以做一个简单的Socket例程了.
服务方:
Java代码 复制代码 收藏代码
  1. import java.io.*;    
  2. import java.net.*;    
  3.   
  4. public class MyServer {    
  5. public static void main(String[] args) throws IOException{    
  6. ServerSocket server=new ServerSocket(5678);    
  7. Socket client=server.accept();    
  8. BufferedReader in=   
  9. new BufferedReader(new InputStreamReader(client.getInputStream()));    
  10. PrintWriter out=new PrintWriter(client.getOutputStream());    
  11. while(true){    
  12. String str=in.readLine();    
  13. System.out.println(str);    
  14. out.println("has receive....");    
  15. out.flush();    
  16. if(str.equals("end"))    
  17. break;    
  18. }    
  19. client.close();    
  20. }    
  21. }   
import java.io.*; 
import java.net.*; 

public class MyServer { 
public static void main(String[] args) throws IOException{ 
ServerSocket server=new ServerSocket(5678); 
Socket client=server.accept(); 
BufferedReader in=
new BufferedReader(new InputStreamReader(client.getInputStream())); 
PrintWriter out=new PrintWriter(client.getOutputStream()); 
while(true){ 
String str=in.readLine(); 
System.out.println(str); 
out.println("has receive...."); 
out.flush(); 
if(str.equals("end")) 
break; 
} 
client.close(); 
} 
} 


这个程序的主要目的在于服务器不断接收客户机所写入的信息只到.客户机发送"End"字符串就退出程序.并且服务器也会做出"Receive"为回应.告知客户机已接收到消息.

客户机代码:
Java代码 复制代码 收藏代码
  1. import java.net.*;    
  2. import java.io.*;    
  3.   
  4. public class Client{    
  5. static Socket server;    
  6.   
  7. public static void main(String[] args)throws Exception{    
  8. server=new Socket(InetAddress.getLocalHost(),5678);    
  9. BufferedReader in=   
  10. new BufferedReader(new InputStreamReader(server.getInputStream()));    
  11. PrintWriter out=new PrintWriter(server.getOutputStream());    
  12. BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));    
  13.   
  14. while(true){    
  15. String str=wt.readLine();    
  16. out.println(str);    
  17. out.flush();    
  18. if(str.equals("end")){    
  19. break;    
  20. }    
  21. System.out.println(in.readLine());    
  22. }    
  23. server.close();    
  24. }    
  25. }   
import java.net.*; 
import java.io.*; 

public class Client{ 
static Socket server; 

public static void main(String[] args)throws Exception{ 
server=new Socket(InetAddress.getLocalHost(),5678); 
BufferedReader in=
new BufferedReader(new InputStreamReader(server.getInputStream())); 
PrintWriter out=new PrintWriter(server.getOutputStream()); 
BufferedReader wt=new BufferedReader(new InputStreamReader(System.in)); 

while(true){ 
String str=wt.readLine(); 
out.println(str); 
out.flush(); 
if(str.equals("end")){ 
break; 
} 
System.out.println(in.readLine()); 
} 
server.close(); 
} 
} 

客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"End"用来做退出标识.

这个程序只是简单的两台计算机之间的通讯.如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的.那么多个客户端如何实现呢?
其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身.而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时.服务器也会使用这一根连线来先后通讯.那么既然如此只要我们存在多条连线就可以了.那么我们的程序可以变为如下:

服务器:

Java代码 复制代码 收藏代码
  1. import java.io.*;    
  2. import java.net.*;    
  3.   
  4. public class MyServer {    
  5. public static void main(String[] args) throws IOException{    
  6. ServerSocket server=new ServerSocket(5678);    
  7. while(true){    
  8. Socket client=server.accept();    
  9. BufferedReader in=   
  10. new BufferedReader(new InputStreamReader(client.getInputStream()));    
  11. PrintWriter out=new PrintWriter(client.getOutputStream());    
  12. while(true){    
  13. String str=in.readLine();    
  14. System.out.println(str);    
  15. out.println("has receive....");    
  16. out.flush();    
  17. if(str.equals("end"))    
  18. break;    
  19. }    
  20. client.close();    
  21. }    
  22. }    
  23. }   
import java.io.*; 
import java.net.*; 

public class MyServer { 
public static void main(String[] args) throws IOException{ 
ServerSocket server=new ServerSocket(5678); 
while(true){ 
Socket client=server.accept(); 
BufferedReader in=
new BufferedReader(new InputStreamReader(client.getInputStream())); 
PrintWriter out=new PrintWriter(client.getOutputStream()); 
while(true){ 
String str=in.readLine(); 
System.out.println(str); 
out.println("has receive...."); 
out.flush(); 
if(str.equals("end")) 
break; 
} 
client.close(); 
} 
} 
} 

这里仅仅只是加了一个外层的While循环.这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息.那么现在就实现了多客户之间的交互了.但是.问题又来了.这样做虽然解决了多客户,可是是排队执行的.也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互.无法做到同时服务.那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了.所以线程是最好的解决方案.
那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系.然后由线程来执行刚才的操作.要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法.而run方法所做的事情.就是刚才单线程版本main所做的事情.因此我们的程序变成了这样:
Java代码 复制代码 收藏代码
  1. import java.net.*;    
  2. import java.io.*;    
  3.   
  4. public class MultiUser extends Thread{    
  5. private Socket client;    
  6.   
  7. public MultiUser(Socket c){    
  8. this.client=c;    
  9. }    
  10.   
  11. public void run(){    
  12. try{    
  13. BufferedReader in=   
  14. new BufferedReader(new InputStreamReader(client.getInputStream()));    
  15. PrintWriter out=new PrintWriter(client.getOutputStream());    
  16. //Mutil User but can't parallel    
  17. while(true){    
  18. String str=in.readLine();    
  19. System.out.println(str);    
  20. out.println("has receive....");    
  21. out.flush();    
  22. if(str.equals("end"))    
  23. break;    
  24. }    
  25. client.close();    
  26. }catch(IOException ex){    
  27. }finally{    
  28.   
  29. }    
  30. }    
  31.   
  32. public static void main(String[] args)throws IOException{    
  33. ServerSocket server=new ServerSocket(5678);    
  34. while(true){    
  35. //transfer location change Single User or Multi User    
  36. MultiUser mu=new MultiUser(server.accept());    
  37. mu.start();    
  38. }    
  39. }    
  40. }   
import java.net.*; 
import java.io.*; 

public class MultiUser extends Thread{ 
private Socket client; 

public MultiUser(Socket c){ 
this.client=c; 
} 

public void run(){ 
try{ 
BufferedReader in=
new BufferedReader(new InputStreamReader(client.getInputStream())); 
PrintWriter out=new PrintWriter(client.getOutputStream()); 
//Mutil User but can't parallel 
while(true){ 
String str=in.readLine(); 
System.out.println(str); 
out.println("has receive...."); 
out.flush(); 
if(str.equals("end")) 
break; 
} 
client.close(); 
}catch(IOException ex){ 
}finally{ 

} 
} 

public static void main(String[] args)throws IOException{ 
ServerSocket server=new ServerSocket(5678); 
while(true){ 
//transfer location change Single User or Multi User 
MultiUser mu=new MultiUser(server.accept()); 
mu.start(); 
} 
} 
} 

我的类直接从Thread类继承了下来.并且通过构造函数传递引用和客户Socket建立了联系.这样每个线程就有了.一个通讯管道.同样我们可以填写run方法.把之前的操作交给线程来完成.这样多客户并行的Socket就建立起来了.
分享到:
评论

相关推荐

    java socket编程实例(出自《java大学教程》)

    学习这些Java Socket编程实例,有助于理解TCP/IP通信的基本原理,为构建实际的网络应用程序打下坚实的基础。你可以通过调试和修改`SocketTest`代码,进一步探索和实践Socket编程的不同场景,如文件传输、聊天应用等...

    java socket 编程,Java socket 编程实例

    #### 三、Java中的Socket编程实例 接下来,我们通过一个简单的Java Socket编程示例来深入了解如何在Java中实现Socket编程。该示例展示了一个简单的Web客户端程序,用于获取一个HTML页面的内容。 ```java import ...

    Java socket编程实例.pdf

    本文将通过一个具体的Java Socket编程实例来深入探讨如何使用Java实现客户端与服务端之间的通信。 #### 二、基础知识概述 在开始具体实例之前,我们需要了解一些基本概念: - **Socket**:Socket是一种用于在网络...

    JAVA socket 编程实例

    java socket 实现简单的客户端和服务端通信

    java socket编程

    Java Socket编程是Java平台中用于实现网络通信的核心API,它基于TCP/IP协议栈,提供了低级别的、面向连接的、可靠的字节流通信。在本文中,我们将深入探讨Java Socket编程的关键概念、工作原理以及如何创建服务端和...

    Java Socket网络编程.pdf

    在Java中,Socket编程主要涉及两个关键类:`ServerSocket`和`Socket`。`ServerSocket`类用于服务器端,它监听指定端口的连接请求。创建一个`ServerSocket`实例,例如`ServerSocket server = new ServerSocket(9998);...

    Java socket编程实例代码(Blog配套代码)

    本实例代码是为了配合博客文章,提供一个简单的Java Socket聊天室的实现,帮助读者更好地理解和应用Socket编程。 在Java Socket编程中,主要有两个核心概念:服务器端(Server)和客户端(Client)。服务器端通过...

    java socket编程实例

    本实例压缩包包含了一系列的Java Socket编程示例,旨在帮助开发者深入理解和掌握Socket编程的核心概念与技术。 Socket在Java中被定义为`java.net.Socket`类和`java.net.ServerSocket`类。Socket编程通常涉及两个...

    android socket 编程实例

    在Android平台上进行网络通信时,Socket编程是一种常见...总之,Android Socket编程实例涵盖了网络通信的基础知识,包括建立连接、传输数据和管理连接等。理解并掌握这些知识,将有助于你构建功能完善的网络通信应用。

    JAVA Socket编程实现文件上传

    Java Socket编程是网络编程的基础,它提供了在两个应用程序之间建立通信连接的能力。在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库...

    《Java网络编程实例:Java网络编程实例》

    本书《Java网络编程实例:Java网络编程实例》显然聚焦于通过实际案例来教授这一核心技能。以下是一些主要的知识点,这些知识点通常会在书中详细讨论: 1. **TCP/IP协议基础**:首先,了解TCP/IP模型和协议栈是非常...

    Socket编程实例(java)

    在这个"Socket编程实例(java)"中,我们将深入探讨Java Socket编程的基本概念、工作原理以及如何编写客户端和服务器端的代码。 1. **Socket基本概念**: Socket,通常被称为套接字,是网络通信的一种接口,它允许两...

    JAVA SOCKET 编码实例

    在Java编程领域,Socket通信是实现网络间应用进程间通信的一种技术。...通过这样的实践,你将对Java Socket编程有更深入的理解,也能熟练运用CINDY包进行开发。记住,理论与实践相结合是掌握技术的最好方式。

    socket编程实例

    总的来说,Java的Socket编程实例是学习网络编程的绝佳起点,它帮助开发者掌握网络通信的基础,并为构建实际的网络应用打下坚实的基础。通过不断练习和深入研究,开发者可以熟练运用Socket编程解决各种网络通信问题,...

    java socket 编程文档

    本文将深入探讨Java Socket编程的基础知识、关键概念以及如何在实践中应用。 一、Socket概述 Socket,也被称为套接字,是网络通信的端点,可以理解为两个应用程序之间的连接通道。在Java中,Socket类(java.net....

    Java网络编程/Java网络编程实例

    1. **Java Socket编程**:Java的Socket类提供了基于TCP/IP协议的网络通信能力。通过ServerSocket创建服务器端,Socket创建客户端,两者建立连接后可以进行双向数据传输。例如,你可以构建一个简单的聊天应用或文件...

    Java Socket 编程html教程

    Java Socket编程是Java网络编程的重要组成部分,主要用于实现客户端与服务器之间的通信。在本文中,我们将深入探讨Java Socket编程的基础知识,以及如何结合HTML进行交互。 首先,Java Socket是TCP/IP协议族的一...

    三步学会Java_Socket编程

    在Java中,Socket编程是实现网络通信的基础,它提供了进程间通信的能力,使得两个相隔万里的计算机可以通过互联网进行数据交换。本篇文章将深入讲解如何通过三步学习Java Socket编程。 **第一步:理解Socket** ...

    Java Socket使用实例

    Java Socket是Java网络编程中的重要组成部分,主要用于实现客户端与服务器之间的通信。在这个“Java Socket使用实例”中,我们将探讨如何创建一个简单的Java Socket应用,它包括一个服务器端和一个客户端,两者通过...

    Java源码:Socket编程.rar_java socket _java编程_socket java_socket编程 jav

    Java Socket编程是网络编程中的重要组成部分,主要用于实现客户端与服务器之间的通信。在Java中,Socket是基于TCP协议的,提供了一种可靠的、基于字节流的双向通信方式。本资料包含的"Java源码:Socket编程"是一个...

Global site tag (gtag.js) - Google Analytics