我的聊天应用程序连接到服务器,用户发送/接收信息。当连接改变时,例如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 :(得分: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),并在相应的广播接收器中手动关闭/重新连接套接字。 (编辑:我看到你已经发现了这个;只是为了完整而保留在这里)