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

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("接受完了!");







你可能感兴趣的:(net)