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

问题描述:用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"才会返回
--------------------- 
作者:不眠的硅谷 
来源:CSDN 
原文:https://blog.csdn.net/csyyj/article/details/53455507 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/CatEatApple/article/details/85252591
今日推荐