不抛出SocketTimeoutException

时间:2015-05-30 13:39:53

标签: java android sockets

我尝试在客户端或服务器端暂时丢失网络时处理这种情况,为了做到这一点,我在客户端使用了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

0 个答案:

没有答案