基本概念
Socket 又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket 类库位于 java.net 包中。ServerSocket 用于服务器端,Socket 是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个 Socket 实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,不会因为在服务器端或在客户端产生不同级别。不管是 Socket 还是 ServerSocket 它们的工作都是通过 SocketImpl 类及其子类完成的。套接字之间的连接过程可以分为四个步骤:
1、服务器监听
服务器监听是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监听网络状态。
2、客户端请求
客户端请求是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字,为此,客户端的套接字必须首先描述它要连接的服务器套接字,指出服务器套接字的地址和端口号,然后向服务器端套接字提出连接请求。
3、服务器端连接确认
服务器端连接确认是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端。
4、客户端连接确认
一旦客户端确认了此描述,连接就建立好了。双方开始进行通信。而服务器继续接收其他客服端套接字的连接请求。
代码实现
服务器端代码实现
ServerSocket server = null;
try {server = new ServerSocket(8888);
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;
}
客户端代码实现
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
try {socket = new Socket("127.0.0.1", 8888);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
// 向服务器端发送数据
out.println("接收到客户端的请求数据...");
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;
}
其中 8888 为端口号,客户端和服务器端端口号必须保持一致,而且端口号不能被其它应用程序占用。127.0.0.1 为服务器端 IP 地址。当代码执行到 server.accept() 时会被阻塞,直到有客户端连接时代码才往下执行。
Netty 视频教程领取加威信 2057878151