【问题标题】:Chat server writing to closed sockets聊天服务器写入已关闭的套接字
【发布时间】:2012-11-27 22:33:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: java sockets


    【解决方案1】:

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

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

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

    【讨论】:

    • 他不需要 CLOSE 消息,客户端无法做的任何事情都不会神奇地关闭服务器上的套接字。只有服务器可以做到这一点。他只需要在两端写一个close()。
    【解决方案2】:

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

    【讨论】:

    • @downvoter 请解释,并说明您的回答原因。尽可能引用。
    【解决方案3】:

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

    【讨论】:

    • 检查套接字是否关闭不会告诉他连接是否被另一端关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多