服務器和客戶端之間交互時使用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("接受完了!");







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章