在一次用Java写socket程序的时候,偶然发现服务端和客服端之间,原本已经建立了连接,但有时会无法通信的情况
刚开始很郁闷,之后开始用wireshark抓包观察,发现刚开始通讯的时候并不会存在这种问题,我写的那个程序有很长的时间会等待服务端的响应,但并不是每隔一定时间进行一次通信确认,所以这种情况下虽然服务端和客服端套接字没有关闭,但是确并没有通讯,然后引起了这个问题。
当不通讯的时间过长的时候,虽然服务端和客服端都没有关闭套接字,但是这时候服务端再向客服端通过DataOutputStream发数据的时候,wireshark却显示并没有抓到任何数据包,所以DataOutputStream应该是如果不通讯的时间过长,会自动关闭,这应该和Java的内部实现有关,这点应该是最坑的,明明都发不了数据了,但却任然能调用write()函数,要不是用wireshark抓包,恐怕要被这个坑死。
之后把程序修改了一下,每隔一定的时间服务端和客户端进行一次存在确认,这样就不会再出现这个问题。