isClosed public boolean isClosed() Returns the closed state of the socket. Returns: true if the socket has been closed Since: 1.4 See Also: close()不过只能在1.4上用,而且是客户端有效,服务器端无法根据此函数判断
谢谢。我发现try{ }catch{}的方法好像不是完全能检测socket的异常断开。 我建了一个socket和一个serverSocket,并定义了socket的输入流in: BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream())); 并循环in.readLine(); 他们开始时是正常连接并正常通讯。 但是后来当我用网上邻居的属性断开网络连接后,客户端就死在in.readLine()那了,根本catch不到。请问各位兄弟有没有遇到这种情况? 本来很想给分,但问题真的未解决。
当客户端用socket连接到服务器后Client在客户端创建,同时ClientListener在服务器创建。
但由于网络的不稳定因素,socket有时会异常断开,我希望socket会自动重新连接,并保证Client与ClientListener的通讯不受影响,应怎么设计?
再线程中不停的检查socket是否断开,如果是连接,则睡眠会,醒来继续检查是否断开。这样做需要消耗很多资源。如果你的系统认为保持连接非常重要的话就可采用这个办法。否则还是不要这样做的好。
至于catch,只能适用于在发送数据或在接受数据的时候能catch到。想到一点,你还是可以catch的,如果你的程序是作为客户端的话,你就需要在接受数据处理部分阻赛,这个时候catch,检查到错误后马上从新连接。如果你的客户端不再接受数据出诸塞的话,而又要检查到数据,只有是采用线程检查了。
因为我希望客户端与服务器在我控制的时间内一直保持连接,不但是客户端,服务器也会不定时间往Socket写信息。
public boolean isClosed()
Returns the closed state of the socket. Returns:
true if the socket has been closed
Since:
1.4
See Also:
close()不过只能在1.4上用,而且是客户端有效,服务器端无法根据此函数判断
因为是否连接良好是要在通讯的过程中监测的,Socket连接不在通讯状态的时候监测是否连接良好就没有什么意义了,也就是说你在传输数据的时可能连接会异常断开,这时候测试连接的线程肯定不可能在运行中(监测线程的优先级不可能比传输数据线程的优先级高吧)!除非你把优先级设得比较高,如果这样的话就太浪费资源了(辅助线程比主要线程的优先级高更是笑话),所以用监测线程就不大适合了。
如果你需要在Socket连接不在使用中时仍然保持连接,比较折衷的办法是,其一,建立一个低优先级的监视线程,用来保持非通讯状态的连接完好。其二,用try...catch...来维持通讯过程中的连接良好(一旦通讯异常立即重新连接)!
我建了一个socket和一个serverSocket,并定义了socket的输入流in:
BufferedReader in =
new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
并循环in.readLine();
他们开始时是正常连接并正常通讯。
但是后来当我用网上邻居的属性断开网络连接后,客户端就死在in.readLine()那了,根本catch不到。请问各位兄弟有没有遇到这种情况?
本来很想给分,但问题真的未解决。