注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

尐鬼じ☆ve伱

和你在一起的日子

 
 
 

日志

 
 

Android下的socket关闭问题(转)  

2013-01-23 15:25:04|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://blog.csdn.net/tumin999/article/details/6691795

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


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


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

  1.             Socket socket = instance.channel.socket();  
  2.             if (socket != null)  
  3.             {  
  4.                 socket.shutdownInput();  
  5.                 socket.shutdownOutput();  
  6.                   
  7.                 InputStream in = socket.getInputStream();  
  8.                 OutputStream ou = socket.getOutputStream();   
  9.                 try{  
  10.                     in.close();  
  11.                     ou.close();  
  12.                 }  
  13.                 catch (IOException e)  
  14.                 {  
  15.                       
  16.                 }  
  17.             }  
  18.             //关闭socket  
  19.             instance.channel.socket().close();  
  20.               
  21.             //关闭channel  
  22.             instance.channel.close();  
比较关键的是前面shutdown部分,和流的关闭部分。最初是只有socket.close()和channel.close(),发现不对后,尝试加入了流的close(),发现仍不能触发DatainputStream.Read_xxx()返回后,尝试加入了shutdown操作,终于成功。!
  评论这张
 
阅读(731)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017