Socket通信

       (1)Socket

       套接字Socket是网络通信的基础,简单来说,可以认为是IP地址+端口,用来区分实现不同应用程序的通信。

       两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一段称为一个Socket。Socket

通常用来实现client-server连接。

       java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client和server。

       (2)Socket通信模型

Socket通信

       Socket通信:

Socket通信

       Socket通信实现步骤:

       1)创建ServerSocket和Socket。

       2)打开连接到Socket的输入/输出流。

       3)按照协议对Socket进行读/写操作。

       4)关闭输入输出流,关闭Socket。

       (3)ServerSocket类

       ServerSocket类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可

能向请求者返回结果。

       ServerSocket类的构造方法:


Socket通信

       ServerSocket类的方法:


Socket通信

Socket通信

       (4)Socket类

       Socket类实现客户端套接字(也可以就叫"套接字")。套接字是两台机器间通信的端。 

       Socket类的构造方法:

Socket通信

       Socket类的方法:

Socket通信

Socket通信

Socket通信

       四通过Socket实现TCP编程

       (1)TCP

       TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据。

       基于TCP协议实现网络通信的类:

       1)客户端的Socket类

       2)服务器端的SoServercket类

       (2)基于TCP的Socket通信具体步骤:

       服务器端:

       1)创建ServerSocket对象,绑定监听端口。

       2)通过accept()方法监听客户端请求。

       3)连接建立后,通过输入流读取客户端发送的请求信息。

       4)通过输出流向客户端发送响应消息。

       5)关闭相关资源。

       客户端:

       1)创建Socket对象,指明需要连接的服务器的地址和端口号。

       2)连接建立后,通过输出流向服务器端发送请求信息。

       3)通过输入流获取服务器响应的消息。

       (3)实例

       一对一(一个服务器和一个客户端)TCP编程实例代码:

       Server.java源文件代码:


[java] view plain copy print?Socket通信Socket通信

  1. <span style="font-size:18px;">import java.net.*;  

  2. import java.io.*;  

  3.   

  4. /* 

  5. *基于TCP协议的Socket通信,实现用户登录 

  6. *服务器端 

  7. */  

  8. public class Server{  

  9.     public static void main(String[] args){  

  10.         try{  

  11.             //1创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听端口  

  12.                ServerSocket serverSocket = new ServerSocket(8111);  

  13.             //2调用accept()方法开始监听,等待客户端的连接  

  14.             System.out.println("***服务器即将启动,等待客户端的连接***");  

  15.             Socket socket = serverSocket.accept();  

  16.             //3获取输入流,并读取客户端信息  

  17.             //字节输入流  

  18.             InputStream is = socket.getInputStream();  

  19.             //将字节输入流转换为字符输入流  

  20.             InputStreamReader isr = new InputStreamReader(is,"utf-8");  

  21.             //为字符输入流添加缓冲  

  22.             BufferedReader br = new BufferedReader(isr);  

  23.             //读取数据  

  24.             String info = null;  

  25.             //循环读取客户端的信息   

  26.             while((info=br.readLine())!=null){  

  27.                 System.out.println("我是服务器,客户端说:"+info);  

  28.             }  

  29.             //关闭输入流  

  30.             socket.shutdownInput();  

  31.             //4获取输出流,响应客户端的请求  

  32.             OutputStream os=socket.getOutputStream();  

  33.             //包装为打印流  

  34.             PrintWriter pw=new PrintWriter(os);  

  35.             pw.write("欢迎您!");  

  36.             //刷新缓存  

  37.             pw.flush();  

  38.               

  39.             //5关闭资源  

  40.             pw.close();  

  41.             os.close();  

  42.             br.close();  

  43.             isr.close();  

  44.             is.close();  

  45.             socket.close();  

  46.             serverSocket.close();  

  47.         }catch(IOException e){  

  48.             e.printStackTrace();  

  49.         }  

  50.           

  51.     }  

  52. }</span>  


       Client.java源文件代码:


[java] view plain copy print?Socket通信Socket通信

  1. <span style="font-size:18px;">import java.net.*;  

  2. import java.io.*;  

  3.   

  4. /* 

  5. *基于TCP协议的Socket通信,实现用户登录 

  6. *客户端 

  7. */  

  8. public class Client{  

  9.     public static void main(String[] args){  

  10.         try{  

  11.             //1创建客户端Socket,指定服务器地址和端口  

  12.                 Socket socket = new Socket("localhost",8111);  

  13.             //2获取输出流,向服务器端发送信息  

  14.             //字节输出流  

  15.             OutputStream os = socket.getOutputStream();  

  16.             //将输出流包装为打印流  

  17.             PrintWriter pw = new PrintWriter(os);  

  18.             pw.write("用户名:admin;密码:123");  

  19.             pw.flush();  

  20.             //关闭输出流  

  21.             socket.shutdownOutput();  

  22.             //获取输入流,并读取服务器端的响应信息  

  23.             InputStream is=socket.getInputStream();  

  24.             BufferedReader br=new BufferedReader(new InputStreamReader(is));  

  25.             String info=null;  

  26.             //循环读取服务器端的信息   

  27.             while((info=br.readLine())!=null){  

  28.                 System.out.println("我是客户端,服务器端说:"+info);  

  29.             }  

  30.               

  31.               

  32.             //4关闭资源  

  33.             br.close();  

  34.             is.close();  

  35.             pw.close();  

  36.             os.close();  

  37.             socket.close();  

  38.         }catch(MalformedURLException e){  

  39.             e.printStackTrace();  

  40.         }catch(IOException e){  

  41.             e.printStackTrace();  

  42.         }   

  43.     }  

  44. }</span>