您的位置:首页 > 编程语言

Socket编程--客户端InputStream数据读取

2016-12-04 18:03 134 查看
问题描述:用java编写一个客户端程序连接指定的IP和端口,一直收不到目标地址返回数据。

运行下面的代码收不到返回数据:(这段代码应该写在一个线程里)

                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));

                    System.out.println("接收服务器反馈: " );    

                    StringBuffer buffer = new StringBuffer();    

                    String line = "";     

                    while ((line = br.readLine())!= null) {                 

                        buffer.append(line);             

                    }       

                    br.close();  

                    System.out.println(buffer.toString());

运行下面的代码可以接收到返回数据:           

                     InputStream is=socket.getInputStream();

                     byte b[]=new byte[1024];

                     is.read(b);

                      System.out.println(new String(b));

原因分析:

readLine()是读取到没有数据时就返回null(因为其它read方法当读到没有数据时返回-1),而实际上readLine()是一个阻塞函数,当没有数据读取时,就一直会阻塞在那,而不是返回null;因为readLine()阻塞后,System.out.println(message)这句根本就不会执行到,所以在接收端就不会有东西输出。要想执行到System.out.println(message),一个办法是发送完数据后就关掉流,这样readLine()结束阻塞状态,而能够得到正确的结果,但显然不能传一行就关一次数据流;另外一个办法是把System.out.println(message)放到while循环体内就可以。
readLine()只有在数据流发生异常或者另一端被close()掉时,才会返回null值。如果不指定buffer大小,则readLine()使用的buffer有8192个字符。在达到buffer大小之前,只有遇到"/r"、"/n"、"/r/n"才会返回。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket java