您的位置:首页 > Web前端

服务器和客户端之间交互时使用BufferedReader的阻塞问题

2012-11-02 16:03 411 查看
1.遇到的问题

Socket socket = serverSocket.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("接受完了!");


上面的代码用于在服务器上面接受客户端的数据。可是while循环永远无法停止,下面的“接受完了”也打印不出来!

2.问题分析:

(1)BufferedReader的readLine方法只有在遇到流结尾或者流关闭了才会返回null

(2)对于读取文件流,当读到文件的结尾时,就是到了流的结尾

(3)但对于socket,不能认为把某次写入到流中的数据读取完了就算流结尾了,但是socket流还存在,还可以继续往里面写入数据然后再读取。所以用BufferedReader封装socket的输入流,调用BufferedReader的readLine方法是不会返回null的

3.还有一种情况,即用InputStream去读,和上面也是一样的错误:

byte[] buf = new byte[1024];
InputStream in = socket.getInputStream();

int i=0;
while((i=in.read(buf))!=-1){
String s = new String(buf);
System.out.println(s);
}
System.out.println("接受完了!");


4.这是我在看tomcat源代码的时候,自己写的一个ServerDemo时犯的错误。用于我们想获得的只是客户端发来的HTTP请求,HTTP请求不会太大,所以可以定义一个不是很大的缓冲区把数据存到缓冲区中去。

byte[] buf = new byte[2048];
InputStream in = socket.getInputStream();
int i = in.read(buf);
String request = new String(buf,0,i);
System.out.println(request);
System.out.println("接受完了!");


5.还有一种方式,经过测试,也可以行得通:

Socket socket = serverSocket.accept();

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null;
while ((line = br.readLine()) != null && line.length()!=0) {
System.out.println(line+"-------------");
}
System.out.println("接受完了!");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐