JAVA-socket通信基础(1)

来源:互联网 发布:淘宝如何加入放心淘 编辑:程序博客网 时间:2024/05/22 01:26

使用ServerSocket和Socke对象t建立简单的套接字(Socket)通信。

1.在C/S通信模式中, Server端需要创建监听端口的 ServerSocket,负责接收客户连接请求。

以下是通信的服务器端程序:

[java] view plaincopy
  1. package Server1;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6. import java.io.PrintWriter;  
  7. import java.net.ServerSocket;  
  8. import java.net.Socket;  
  9.   
  10. public class Server1 {  
  11.     public static void main(String[] args) {  
  12.         // TODO Auto-generated method stub  
  13.         ServerSocket serverSocket=null;  
  14.         //创建一个ServerSocket对象  
  15.         Socket socket=null;  
  16.         //创建一个socket对象  
  17.         BufferedReader sockIn;  
  18.         PrintWriter sockOut;  
  19.         //创建输入输出对象  
  20.         BufferedReader stdIn=new BufferedReader(new InputStreamReader(System.in));  
  21.         //使用BufferedReader包裹输入流对象,获得输入字段。  
  22.         try{  
  23.             serverSocket=new ServerSocket(8888);  
  24.             //这里创建了一个端口号为8888的ServerSocket,ServerSocket是服务器Socket,  
  25.             //可以用来侦听连接,为每个新建立的连接都创建一个Socket对象.  
  26.             System.out.println("server listening on port 8888");  
  27.             socket=serverSocket.accept();  
  28.             //调用ServerSocket的accept()方法,会返回一个socket,保存在已经声明的socket中,这个socket就代表这次连接  
  29.             if(socket==null){  
  30.                 //判断sockt是否为空  
  31.                 System.out.println("socket is null");  
  32.                 System.exit(1);  
  33.             }  
  34.             System.out.println("accept connection from:"+socket.getInetAddress().getHostAddress());  
  35.             //socket代表这次连接,可以取IP地址  
  36.             sockIn=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  37.             //创建输入流,可以使用这个对象接收Client发来的数据  
  38.             sockOut=new PrintWriter(socket.getOutputStream());  
  39.             //创建输出流,可以使用这个对象向Client发送数据  
  40.             sockOut.println("hello I am server");  
  41.             //使用sockOut对象发送信息  
  42.             sockOut.flush();  
  43.             //在使用缓冲区传输数据时,添加flush强制发送数据,不必等缓冲区慢,防止小数据无法传输  
  44.             String s=sockIn.readLine();  
  45.             //使用sockIn读取接收的数据  
  46.             System.out.println("Server received:"+s);  
  47.             sockOut.close();  
  48.             sockIn.close();  
  49.             socket.close();  
  50.             serverSocket.close();  
  51.         }catch(Exception e){  
  52.             System.out.println(e.toString());  
  53.             System.out.println("server exit");  
  54.         }  
  55.           
  56.   
  57.     }  
  58.   
  59. }  
2.socket用于建立点对点的连接,在建立连接前,必须有一方监听,一方请求,一旦建立连接后,就可以利用socket实现数据的双向传输。

以下是Client客户端的代码,为方便测试,直接使用127.0.0.1作为服务器地址。

[java] view plaincopy
  1. package Client1;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.InputStreamReader;  
  5. import java.io.PrintWriter;  
  6. import java.net.Socket;  
  7.   
  8. public class Client1 {  
  9.   
  10.     public static void main(String[] args) {  
  11.         // TODO Auto-generated method stub  
  12.         Socket socket=null;  
  13.         BufferedReader sockIn;  
  14.         PrintWriter sockOut;  
  15.         try{  
  16.             socket=new Socket("127.0.0.1",8888);  
  17.             //建立socket连接,连接本机地址,8888端口  
  18.             if(socket==null){  
  19.                 //判断是否连接  
  20.                 System.out.println("socket null,connection error");  
  21.                 System.exit(1);  
  22.             }  
  23.             System.out.println("conected to server");  
  24.             sockIn=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  25.             sockOut=new PrintWriter(socket.getOutputStream());  
  26.             //创建输入输出流,这时的sockIn已经从socket中接收到数据  
  27.             sockOut.println("hello,I am client");  
  28.             //使用sockOut发送数据  
  29.             sockOut.flush();  
  30.             String s=sockIn.readLine();  
  31.             System.out.println("Client recived:"+s);  
  32.             sockOut.close();  
  33.             sockIn.close();  
  34.             socket.close();  
  35.         }catch(Exception e){  
  36.             System.out.println(e.toString());  
  37.             System.out.println("client exit");  
  38.         }  
  39.   
  40.     }  
  41.   
  42. }  
部分代码注释参见服务器端

3.socket通信的本地测试。

由于在eclipse中难以测试通信,需要使用cmd进行测试,在使用cmd测试时,需要注意运行时包的问题。

网上有说法在eclipse中 窗口->新建窗口 可以多窗口测试,本人实测无效,两个窗口公用一个控制台,无法显示预期结果(如有问题,欢迎指正)。

以作者的路径为例,我的.JAVA文件在C:\Users\lenovo\workspace\ch16\src\Client1\Client1.java

使用该地址编译是可以通过的,但是无法运行,会报错,

Exception in thread "main" java.lang.NoClassDefFoundError

如图:

这是由于包嵌套的原因,应该使用如下的关系编译,程序运行结果如图:



0 0
原创粉丝点击