Android下的socket关闭问题

来源:互联网 发布:淘宝店铺号怎么弄 编辑:程序博客网 时间:2024/05/20 21:22

在项目中利用NIO进行建链过程,在建链和协议初始化完毕后,将socket改为block模式进行数据收发,但此后调用socket.close()后发现该socket并未断开,但客户端显示的socket状态,closed属性都正常。


经反复调试后,发现在socket上读取数据时,使用了DataInputStream,在socket关闭后,读数据线程仍阻塞在DataInputStream.Read_xxx()上,也就是说socket.close()并未引起该函数的异常,导致Android始终未真正断开socket。


在仔细阅读了Android的文档后,发现使用下述方法可完美断开socket:

            Socket socket = instance.channel.socket();        if (socket != null)        {        socket.shutdownInput();        socket.shutdownOutput();                InputStream in = socket.getInputStream();        OutputStream ou = socket.getOutputStream();         try{        in.close();        ou.close();        }        catch (IOException e)        {                }        }            //关闭socket            instance.channel.socket().close();                        //关闭channel            instance.channel.close();
比较关键的是前面shutdown部分,和流的关闭部分。最初是只有socket.close()和channel.close(),发现不对后,尝试加入了流的close(),发现仍不能触发DatainputStream.Read_xxx()返回后,尝试加入了shutdown操作,终于成功。!


原创粉丝点击