android怎么关闭socket,Android下的socket关闭问题
在项目中利用NIO进行建链过程,在建链和协议初始化完毕后,将socket改为block模式进行数据收发,但此后调用socket.close()后发现该socket并未断开,但客户端显示的socket状态,closed属性都正常。经反复调试后,发现在socket上读取数据时,使用了DataInputStream,在socket关闭后,读数据线程仍阻塞在DataInputStream.Read_xxx
在项目中利用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操作,终于成功。!
更多推荐
所有评论(0)