[转]java Socket InputStream 阻塞 问题

第一次写,不好意思,有不对地方多多指出


在Java Socket 编程中,对 InputStream的read()=-1标明流结束,一般按照

Java代码 复制代码 收藏代码
  1. public byte[] getReqData(InputStream is){   
  2.         ByteArrayOutputStream baos = new ByteArrayOutputStream();   
  3.         try{   
  4.             int iR = is.read();   
  5.             while(iR != -1){   
  6.                 baos.write(iR);   
  7.                 iR = is.read();   
  8.             }   
  9.         }catch(Exception e){   
  10.             return null;   
  11.         }   
  12.         return baos.toByteArray();   
  13.     }  
获取byte 

但是出现了一直等待现象,而在客户端是本地发送测试的。。。跟踪是在iR = is.read()时在读完最后一个字节就阻塞了,继续等-1的到来啊。。。。

网上也有很多对此的提问。

搜索了下,发现这个帖子讨论的比较多:

http://ansonlai.iteye.com/blog/556287

楼主帖子和回复也很有帮助。不过俺还是不满意,继续搜索,测试,得以发现原因,在那个帖子回复如下:

在我的程序中同样出现了这个问题,搜索到此。3楼的方案虽然解决了问题,仍然没有说明问题所在。用中文搜索没找到满意解决,只得英文搜索,搜索到:http://stackoverflow.com/questions/611760/java-inputstream-read-blocking

其中有段话有启发:It returns -1 if it's end of stream. If stream is still open (i.e. socket connection) but no data has reached the reading side (server is slow, networks is slow,...) the read() blocks.

最后发现其实有关 read()本身没问题,而是client端没有做好。

在socket.getOutputStream().write(data)后,尝试socket.getOutputStream().close()。服务器端没问题了,read()会返回-1咯。。。呵呵,但是(最怕但是),客户端close OutputStream后等带服务器的回应的InputSteam.read()出现了:socket closed Exception

最后发现Socket有 shutdownOutput()方法!哈哈,在客户端write,flush后再调用shutdownOutput(),成了!后面的inputStream仍然可以。。。

当然,如果客户端和服务器程序是各自开发,楼主及3楼的方法还是必要。

这次我碰到的问题其实说明这个现在还是普便存在的:本来用http实现通信的,用httpserver的httpExchange.getRequestBody()得到的InputStream处理就没有出现这个问题。后来到现场才发现服务器的开发单位最终是用socket实现的通信,还专门提出了socket的头6个字节表示长度,俺这么一写,才发现对方可能也是碰到这个问题,采取了长度方法来处理。(我是在做服务器端simulator,同时也要做这个simulator的测试,所以客户端simulator也做,没听糊涂吧:) )

shutdownOutput
public void shutdownOutput()
                    throws IOException
Disables the output stream for this socket. For a TCP socket, any previously written data will be sent followed by TCP's normal connection termination sequence. If you write to a socket output stream after invoking shutdownOutput() on the socket, the stream will throw an IOException.

也按照1楼同学的提示,对一个socket的先发一段,睡10秒,100秒再发后面一段,服务器都可以正常接收,客户端也正常收到返回数据

原文链接:http://www.iteye.com/topic/941350

posted @ 2013-01-18 21:29  尼玛范爷  阅读(21345)  评论(0编辑  收藏  举报