Network-Socket

Network-Socket

基于TCP的Socket

Socket socket = new Socket(String ip, int port); // 本地进程间通信使用 "localhost"
boolean isConnected = socket.isConnected();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write(byte[] data);
writer.flush();
writer.close();

DataInputStream input = new DataInputStream(new BufferedInputStream(socked.getInputStream));
byte[] bytes = new byte[MAX_LENGTH_EACH_TIME];
while(input.read(bytes) != -1) {

}
服务端:
ServerSocket serverSocket = new ServerSocket(int port);
Socket socket = ServerSocket.accept();
InputStream ......

  • socket.accept()函数对应着TCP三次握手中哪一次握手,哪个函数代表连接建立完毕,四次挥手的过程?

没有对应关系。accept()发生在三次握手之后。服务器监听请求连接,成功三次握手的连接会被存放到连接队列中,accept()方法只是从服务器的连接队列中取出了具体的一个连接实例。

基于UDP的Socket

// 发送
DatagramSocket socket = new DatagramSocket();
socket.connect(String ip, int port);
DatagramPacket sendPacket = new DatagramPacket(byte[] data, int data.length, String ip, int port);
socket.send(sendPacket);
// 接收
while(socket.isConnect()) {
byte[] data = new byte[MAX_LENGTH_EACH_TIME];
DatagramPacket rcvPacket = new DatagramPacket(data, data.length);
socket.receive(rcvPacket);
rcvPacket.getData().length // 等效于 data.length,等于 MAX_LENGTH_EACH_TIME
rcvPacket.getLength() // 实际接收的数据长度,最大 64k
......
}

Socket长连接

isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()都是本地判断,只是本地操作connect()或close()方法后保存的状态,无法判断服务端是否主动断开,OutputStream.write()在服务端关闭时也能照常发送不会报错。

采用服务端心跳回复的机制,客户端发送心跳后,服务端需要回复心跳,并设置中断超时,超过几次心跳后仍然没有回复则主动断开连接。