Socket又称"套接字",应用程序一般经过“套接字”向网络发生请求或者应答网络请求。java
Socket和ServerSocket类库位于java.net包中,ServerSocket用于服务端,Socket是创建网络链接时使用的。在链接成功时,应用程序两端都会产生一个Socket实例。操做这个实例,完成所需的会话。对于一个网络链接来讲,套接字是平等的,不由于在服务器端或在客户端而产生级别。无论Socket仍是ServerSocket它们的工做都是经过SocketImpl类及其子类完成的。编程
首先咱们先看一段代码,了解Socket编程链接,而后再作详细的介绍:服务器
服务端:网络
package bhz.bio; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { final static int PROT = 8765; public static void main(String[] args) { ServerSocket server = null; try { server = new ServerSocket(PROT); System.out.println(" server start .. "); //进行阻塞 Socket socket = server.accept(); //新建一个线程执行客户端的任务 new Thread(new ServerHandler(socket)).start(); } catch (Exception e) { e.printStackTrace(); } finally { if(server != null){ try { server.close(); } catch (IOException e) { e.printStackTrace(); } } server = null; } } }
package bhz.bio; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ServerHandler implements Runnable{ private Socket socket ; public ServerHandler(Socket socket){ this.socket = socket; } @Override public void run() { BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); out = new PrintWriter(this.socket.getOutputStream(), true); String body = null; while(true){ body = in.readLine(); if(body == null) break; System.out.println("Server :" + body); out.println("服务器端回送响的应数据."); } } catch (Exception e) { e.printStackTrace(); } finally { if(in != null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if(out != null){ try { out.close(); } catch (Exception e) { e.printStackTrace(); } } if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } socket = null; } } }
客户端:socket
package bhz.bio; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class Client { final static String ADDRESS = "127.0.0.1"; final static int PORT = 8765; public static void main(String[] args) { Socket socket = null; BufferedReader in = null; PrintWriter out = null; try { socket = new Socket(ADDRESS, PORT); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); //向服务器端发送数据 out.println("接收到客户端的请求数据..."); out.println("接收到客户端的请求数据1111..."); String response = in.readLine(); System.out.println("Client: " + response); } catch (Exception e) { e.printStackTrace(); } finally { if(in != null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if(out != null){ try { out.close(); } catch (Exception e) { e.printStackTrace(); } } if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } socket = null; } } }
套接字链接的过程能够分为四个步骤,服务器监听,客户端请求服务器,服务器确认,客户端确认,进行通讯。ide
(1)服务器监听:是服务端套接字并不定位具体的客户端套接字,而是出于等待链接的状态,实时监控网络状态。this
(2)客户端请求:是指由客户端的套接字提出链接请求,要链接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述他要链接的服务器的套接字,指出服务器端套接字的地址和端口号,而后就向服务器端套接字提出链接请求。spa
(3)服务器端链接确认:是指当服务器端套接字监听到或者接收到客户端套接字的链接请求,他就响应客户端套接字的请求,创建一个新的线程,把服务器端套接字的描述发送给客户端。.net
(4)客户端链接确认:一旦客户确认了此描述,链接就创建好了。双方开始通讯,二服务器端套接字继续处于监听状态,继续接收其余客户端套接字的链接请求。线程