サーバとクライアント間のインタラクション時にBufferedReaderを使用するブロックの問題

1768 ワード

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ソースコードを見ているときに、自分で書いたServer Demoのエラーです.私たちが得たいのはクライアントからの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("    !");