サーバとクライアント間のインタラクション時にBufferedReaderを使用するブロックの問題
1768 ワード
1.問題
上記のコードは、サーバ上でクライアントのデータを受信するために使用されます.しかしwhileサイクルは永遠に止まらず、次の「受け入れ済み」も印刷できません!
2.問題分析:
(1)BufferedReaderのreadLineメソッドは、ストリームの最後に遭遇した場合またはストリームが閉じた場合にのみnullを返す
(2)読み出しファイルストリームについては,ファイルの最後に読み出されるとストリームの最後になる.
(3)ただし,socketについては,ある回ストリームに書き込まれたデータの読み取りが完了してストリームが終了したとは考えられないが,socketストリームはまだ存在し,引き続き中にデータを書き込んでから読み取ることもできる.したがって、BufferedReaderでsocketの入力ストリームをカプセル化し、BufferedReaderを呼び出すreadLineメソッドはnullを返さない
3.InputStreamで読む場合、上記と同様のエラーが発生します.
4.これはtomcatソースコードを見ているときに、自分で書いたServer Demoのエラーです.私たちが得たいのはクライアントからのHTTPリクエストだけで、HTTPリクエストはあまり大きくないので、あまり大きくないバッファを定義してデータをバッファに保存することができます.
5.もう一つの方法は、テストを経ても通じることができます.
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(" !");