2010-01-05 25 views
7

我的聊天应用程序连接到服务器,用户发送/接收信息。当连接发生变化时,例如3g-> wifi,wifi-> 3g,丢失数据连接等,socket有时会在断开连接之前保持连接状态。在此期间,无法判断连接是否仍处于活动状态,看起来好像邮件发送得很好。其他时候,发送消息时,它会抛出IO错误并断开连接。连接变化时套接字不断开

除了实现代码来检测连接更改并重新适当地重新连接之外,是否有可能在连接更改时立即抛出IO异常?

编辑:

Socket sock = new Socket(); 
sock.connect(new InetSocketAddress(getAddress(), getPort())), getTimeout()); 
//get bufferedReader and read until BufferedReader#readLine() returns null 
我不使用setSoTimeout作为数据可以不被移送根据远程服务器的配置的长时间

:我使用以下代码连接。

+0

然后看到http://stackoverflow.com/questions/969866/java-detect-lost-connection http://stackoverflow.com /问题/ 155243 /为什么 - 是 - 它不可能的 - 不 - 尝试-IO到检测 - 这-TCP-插座为宽限期 – 2010-01-05 23:23:36

回答

0

这是一个老问题,我曾在数据库世界中看过几次。

我在那里使用的解决方案是在应用程序级别管理连接。我明确地通过连接发送某种类型的无操作消息(即SELECT 1 WHERE FALSE),每隔一段时间ping一次,如果失败,我会拆除并重新建立连接,如果原始连接可能会重新建立连接不接受关系。

0

由于前面的答案已经指出,这是一个常见的问题。即使在发送自定义的“ping”之后,它可能也需要一段时间,直到套接字意识到底层连接中断。另外,由于它们的尾部状态,使用3-4G移动网络的定期ping是相当耗能的。不要这样做!

但是,您可以做的是requesting to get informed when the connectivity changes (last section),并在相应的广播接收器中手动关闭/重新连接套接字。 (编辑:我看你已经发现了这个;只是保持在这里的完整性)