我尝试在客户端或服务器端暂时丢失网络时处理这种情况,为了做到这一点,我在客户端使用了setSoTimeout()
方法。 (服务器端用其他语言编写)
我的客户计划如下:
1.客户端每1秒向服务器发送ping,
2.timeout设置为2秒,因此如果在阻塞2秒后没有收到数据,则readLine()
应该抛出异常
执行此操作后,我尝试了以下方案:
- 我启动程序
-client每秒发送ping,服务器正确接收它们并回复。到目前为止一切顺利,
- 现在我突然关掉了服务器的wifi。服务器等待ping并在2秒后关闭套接字
- 所有客户端仍然在readLine()
中被阻止,尽管自上次ping回复超过2秒后它应该抛出SocketTimeoutException
(就像服务器一样)
然后我稍微更改了客户端方案,并将超时设置为0.5秒,而不是2
这就是发生的事情(这次我没有关闭wifi):
- 我启动程序
- 发送第一个ping,服务器接收它,然后回复
- 0.5秒后,readLine()
抛出SocketTimeoutException
,套接字关闭
-server也会关闭套接字
问题:为什么在第一个场景中没有抛出异常,为什么在第二个场景中抛出异常
Socket socket = new Socket("someaddress", someport);
socket.setSoTimeout(2000);
//writes to socket
bufferedwriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//reads from socket
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
while(bufferedwriter!=null)
{
try
{
bufferedwriter.write("ping");
bufferedwriter.flush();
Thread.sleep(1000);
}
catch (IOException e) { Log.e("SPLASH", "IO Exception in pinger"); e.printStackTrace(); }
catch (InterruptedException e) { Log.e("SPLASH", "In.Exception in pinger"); e.printStackTrace(); }
}//end while
}}).start();
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
String msg;
try {
while((msg=in.readLine())!=null)
{
System.out.println("user received: " + msg);
}//end while
}
catch (Exception e) { e.printStackTrace(); }
}}).start();
更新。
有趣的是,在等待来自输入流的某些消息时,in
被赋予null
值时,会抛出SocketTimeoutException