本质上我有一个服务器类和一个客户端类,客户端创建一个套接字并将你输入的任何内容发送到服务器,然后将其写入来自所有现有客户端的套接字向量的输出流。它很有效,除非您关闭聊天客户端,之后发送的下一条消息会出现以下异常:
java.net.SocketException: Software caused connection abort: socket write error
我认为正在发生的事情是客户端关闭的套接字要么不关闭服务器套接字向量中的套接字,要么即使它关闭,它仍然在向量中然后尝试写入已关闭的套接字。这听起来像是可能发生的事情吗?我不完全理解socket.close()方法对它所连接的套接字的作用。
答案 0 :(得分:1)
您在客户端关闭套接字,但在服务器端它没有关闭,这就是您获得此异常的原因。
在优雅的关闭中,您应该从客户端发送一条CLOSE消息,该消息将关闭服务器端的套接字。
如果客户端上的套接字已关闭,那么您必须在服务器端处理例外,例如将它从插座矢量中删除。
答案 1 :(得分:0)
如果客户端关闭了他的套接字,您将在服务器上读取EOS(read()
返回-1,readLine()
返回null
,readXXX()
抛出EOFException
任何其他X),或在写作时得到IOException: connection reset by peer
,可能不是在第一次写作时。如果发生上述任何一种情况,您必须关闭服务器中的套接字并以各种方式忘记该客户端。
答案 2 :(得分:-1)
我认为这并不是说连接的两面都是用手握在一起,如果你分开它们,它们总会感觉到它。在发送和捕获异常之前检查套接字是否已关闭以解决此问题。