1

本质上,我有一个服务器类和一个客户端类,客户端创建一个套接字并将您键入的任何内容发送到服务器,该服务器被写入来自所有现有客户端的套接字向量的输出流。它运行良好,除非您关闭聊天客户端,之后发送的下一条消息会出现以下异常:

java.net.SocketException: Software caused connection abort: socket write error

我认为发生的事情是客户端关闭的套接字要么没有关闭服务器的套接字向量中的套接字,要么即使它关闭了,它仍然保留在向量中,然后尝试写入已关闭的套接字。这听起来像可能发生的事情吗?我不明白 socket.close() 方法对它所连接的套接字做了什么。

4

3 回答 3

1

您在客户端关闭了套接字,但在服务器端它没有关闭,这就是您收到此异常的原因。

在正常关闭中,您应该从客户端发送 CLOSE 消息,该消息将关闭服务器端的套接字。

如果客户端上的套接字已关闭,那么您必须在服务器端处理您的异常,例如通过从套接字向量中删除它。

于 2012-11-27T22:37:12.527 回答
0

如果客户端关闭他的套接字,您将在服务器上读取 EOS(read()返回 -1、readLine()返回nullreadXXX()抛出EOFException任何其他 X),或者IOException: connection reset by peer在写入时获得一个,可能不是在第一次写入时。如果发生上述任何一种情况,您必须关闭服务器中的套接字并以各种方式忘记该客户端。

于 2012-11-27T23:44:02.193 回答
-1

我不认为这就像连接的双方是手牵手,如果你分开他们总是会感觉到。发送前检查socket是否关闭,并捕获异常来解决这个问题。

于 2012-11-27T22:37:19.297 回答