※ ChatGPTを利用し、要約された質問です(原文:ネットワークプログラミングでの読み込みについて)
ネットワークプログラミングでの読み込みについて
現在ネットワークプログラミングの勉強をしています。
クライアント側の標準入力で文字列入力→Enter押下→
サーバ側の標準出力でその文字列を出力
という処理を行いたいのですが、サーバ側の出力が表示されません。
まず具体的にソースを出した方が状況を説明しやすいので、提示致します。
-------------------------------
サーバ側
public static void main(String[] args)throws Exception
ServerSocket ss=new ServerSocket(7777);
while(true){
sock=ss.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(sock.getInputStream()));
String str=br.readLine();
if(str.equals("end"))break;
System.out.println(str);
}
sock.close();
ss.close();
br.close();
}
----------------------------------
クライアント側
public static void main(String[] args)throws Exception
{
Socket sock=new Socket(コンピュータ名,7777);
while(true){
BufferedWriter bw=new BufferedWriter(new InputStreamReader(sock.getOutputStream()));
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();
bw.write(str);
bw.flush();
if(str.equals("end"))break;
}
bw.close();
sock.close();
----------------------------------
自分で色々試したところバッファリングで入力された文字列を溜めたまま
吐き出していないのが原因のような気がするのですが、BufferedReader#readLineのドキュメントを見ると
>1 行のテキストを読み込みます。1 行の終端は、改行 (「\n」) か、復帰 (「\r」)、または復行とそれに続く改行のどれかで認識されます。
とあるのでクライアント側のbw.write(str)の後にbw.newLine()を呼んだりstr+="\n"
などを行ってみたところ、
サーバ側は最初の入力をすぐに出力し、その後のクライアントからの入力には無反応になりました。
このようになる原因と解決が分かる方居ましたら、教えてください。
お礼
ありがとうございます! 回答のとおりコードを直したところちゃんと動きました。 accept()はループ毎に呼ばないで最初の接続時だけ呼べばcloseするまで通信は確立出来るんですね。 BufferedReader#readLineも標準入力からの入力+Enter押下した際の、 「Enter押下=復帰改行」で\nが含まれた文字列が返ってくるのかと思ったら 終端文字は含まれないようですね。 非常に分かりやすい回答を頂き助かりました! 今回は本当にありがとうございます!