连接发生变化时套接字不会断开连接

时间:2010-01-05 19:56:46

标签: java android exception sockets

我的聊天应用程序连接到服务器,用户发送/接收信息。当连接改变时,例如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,因为根据远程服务器的配置,数据可能无法长时间传输。

3 个答案:

答案 0 :(得分:1)

您在谈论java.net.Socket连接吗?然后尝试setSoTimeout()。否则请指定您的连接方式。

答案 1 :(得分:0)

这是我之前在数据库世界中见过几次的一个老问题。

我在那里使用的解决方案是在应用程序级别管理连接。我通常会像ping一样明确地在连接上发送某种类型的无操作消息(即SELECT 1 WHERE FALSE),如果失败,我会拆除并重新建立连接,可能是故障转移服务器,如果原件不接受连接。

答案 2 :(得分:0)

如前所述,已经指出,这是一个常见问题。即使在发送自定义“ping”之后,它可能还需要一些时间,直到套接字意识到底层连接被破坏。此外,由于其尾部状态,使用3-4G移动网络时,常规ping是非常耗能的。不要那样做!

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