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我不认为代码中有什么特别之处:)无论如何,我也添加了代码