Java 未引发SocketTimeoutException
我尝试在客户端或服务器端处理网络暂时丢失的情况,为此,我在客户端使用了Java 未引发SocketTimeoutException,java,android,sockets,Java,Android,Sockets,我尝试在客户端或服务器端处理网络暂时丢失的情况,为此,我在客户端使用了setSoTimeout()方法。(服务器端使用其他语言编写) 我的客户方案如下: 1.客户端每隔1秒向服务器发送ping 2.timeout设置为2秒,因此如果阻塞2秒后没有收到数据,则readLine()应该引发异常 在实现此功能后,我尝试了以下场景: -我启动了这个项目 -客户端每秒发送ping,服务器正确接收并回复ping。到目前为止还不错 -现在我突然关掉了服务器的wifi。服务器等待ping并在2秒后关闭套接字 -
setSoTimeout()
方法。(服务器端使用其他语言编写)
我的客户方案如下:
1.客户端每隔1秒向服务器发送ping
2.timeout设置为2秒,因此如果阻塞2秒后没有收到数据,则readLine()
应该引发异常
在实现此功能后,我尝试了以下场景:
-我启动了这个项目
-客户端每秒发送ping,服务器正确接收并回复ping。到目前为止还不错
-现在我突然关掉了服务器的wifi。服务器等待ping并在2秒后关闭套接字
-然而,客户端仍然在readLine()
中被阻止,尽管自上次ping应答后超过2秒时,它应该抛出SocketTimeoutException
(就像服务器那样)
然后我稍微更改了客户端方案,并将超时设置为0.5秒,而不是2秒
这就是发生的情况(我这次没有关闭wifi):
-我启动了这个项目
-第一个ping被发送,服务器接收并回复
-0.5秒后,readLine()
抛出SocketTimeoutException
,套接字关闭
-服务器也会关闭套接字
问题是:为什么在第一个场景中没有抛出异常,为什么在第二个场景中抛出异常
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();
更新。
有趣的是,当在等待来自inputstream的消息时,中的
被赋值为null
值时,会抛出SocketTimeoutException
,显示客户端的代码please@KErlandsson我不认为代码中有什么特别之处:)无论如何,我也添加了代码