【发布时间】:2011-03-09 10:42:01
【问题描述】:
我正在循环读取 Java 套接字。
如果读取引发异常,我想重新打开套接字。
为了测试这一点,我只是关闭了套接字并捕获了异常。
问题是,当我尝试重新打开套接字时:
serverSocket = new ServerSocket(port)
socket = serverSocket.accept()
它抛出一个异常:
java.net.BindException: The socket name is already in use
这是一个直接的测试问题。但它也可能发生在生产中。
如何在异常发生后通过打开新的套接字连接可靠地恢复 被扔了?
【问题讨论】:
-
如果线程抛出异常,你应该close() serversocket,然后等待10秒重新打开同一个端口。
-
如果服务器出于某种原因关闭套接字并且客户端检测到 isClosed () 那么它本身不能重新打开,而是客户端必须创建一个新的套接字。 10 秒似乎是任意的。指数退避重试模式会更合适。