gpt4 book ai didi

Java:如何使用 ServerSocket 和 Socket 正确关闭套接字连接

转载 作者:可可西里 更新时间:2023-11-01 02:40:53 25 4
gpt4 key购买 nike

我目前有一个简单的即时消息程序,它使用 Java 的 SocketServerSocket类。它按预期运行,但是当我尝试关闭连接时,它没有使用 4 次握手 TCP 拆卸来关闭连接。相反,它使用 RST 数据包突然关闭连接。

我关闭连接的方式是从客户端向服务器发送一个字符串,服务器会将其识别为关闭连接的命令。然后,我在服务器上使用 ServerSocket.close() 方法,在客户端上使用 Socket.close() 方法。

使用这些类正确关闭 TCP 连接的正确方法和/或事件顺序是什么?

客户端断开代码:

//Disconnects from remote server
//Returns true on success, false on failure
public boolean disconnect(){
try{
this.clientOut.println("0x000000");
this.clientRemoteSocket.close();
this.isConnected = false;
return true;
}catch(Exception e){
return false;
}
}

服务器端断开代码:

//Check to see if the client wants to close the connection
//If yes, then close the connection and break out of the while loop
if(incoming.equals("0x000000")){
serverLocalSocket.close();
break;
}

编辑:代码工作得很好。我只是想学习 Java 中的套接字编程,并且知道正确的 TCP 拆卸过程是包括 4 次握手。一个 FIN 数据包到远程主机,然后一个 ACK​​ 数据包从远程主机返回。然后是来自远程主机的 FIN 数据包,然后是到远程主机的 ACK 数据包。通过 Wireshark 监控流量时,我没有得到。相反,我正在向远程服务器获取 FIN,然后从服务器返回 RST/ACK。

image描述了正确的 TCP 4 路拆卸过程。

到目前为止,我发现的所有内容都表明,所有需要的只是调用 close() 或让 Java 的 Try-with-resources 语句处理清理。我看不到 Java 实现了不符合标准 TCP 规范的功能。很有可能我以错误的顺序或类似的方式调用了某些线路,我只是没有意识到这一点。

最佳答案

如果您在关闭时重置自己的连接,则:

  1. 您还没有读取对等方发送的所有待处理传入数据,或者
  2. 您已经写入了先前已被对等方关闭的连接。

在这两种情况下,都是应用程序协议(protocol)错误。

关于Java:如何使用 ServerSocket 和 Socket 正确关闭套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30020786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com