在项目中利用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操作,终于成功。!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐