• ベストアンサー

ソケット:書き出しをソケット経由で読み込みできない

お世話になります。 今、Javaでのソケットプログラミングについて学習をはじめて、はじめてのサンプルプログラムが失敗しました。 そこでもうちょっと簡単にしてみたのですが(一部の抜粋が以下のソースです)、またまたうまくいきません。 エコーサーバのテストなのですが、client : after send messageと表示されたところで処理が止まってしまいます。 結果は最下位に貼り付けてあります。 どうかよろしくお願いします。 // reader/writerの取得 BufferedWriter clientWriter = new BufferedWriter( new OutputStreamWriter(sockClient.getOutputStream()), BUFFERSIZE); BufferedReader clientReader = new BufferedReader( new InputStreamReader(sockClient.getInputStream()), BUFFERSIZE); BufferedWriter serverWriter = new BufferedWriter( new OutputStreamWriter(sockServer.getOutputStream()), BUFFERSIZE); BufferedReader serverReader = new BufferedReader( new InputStreamReader(sockServer.getInputStream()), BUFFERSIZE); // サーバのローカルとクライアントの接続先が同じことの確認 System.out.println("client port : " + sockClient.getPort()); System.out.println("client addr : " + sockClient.getInetAddress().getHostAddress()); System.out.println("server port : " + sockServer.getLocalPort()); System.out.println("server addr : " + sockServer.getLocalAddress().getHostAddress()); // クライアント→サーバー→クライアントの順にmaaaaaいうえおを送信 String strMessage = "maaaaaいうえお"; System.out.println("client : send message : " + strMessage); clientWriter.write(strMessage); System.out.println("client : after send message"); String msgGet = serverReader.readLine(); System.out.println("server : got : " + msgGet); serverWriter.write(msgGet); System.out.println("client : got : " + clientReader.readLine()); ------------以下が結果------------- client port : 4544 client addr : 127.0.0.1 server port : 4544 server addr : 127.0.0.1 client : send message : maaaaaいうえお client : after send message

質問者が選んだベストアンサー

  • ベストアンサー
noname#49428
noname#49428
回答No.1

Writerで出力した後、 Writer#newLine(); Writer#flush(); メソッドを呼んでください。

ggaogg
質問者

お礼

解決しました。ありがとうございました。 readLine()メソッドは、改行文字が検出されるまでブロックしながらバッファに読み込むので、改行文字をちゃんと送ってやらないと、ずっとブロックし続けてしまうみたいですね。 ・・・これで前進できます。ありがとうございました。 あと、回答者:rinkunさんの指摘にあったように、質問の書き方がまずかったと思います。次回からは気をつけますので、よろしくお願いします。 -------------そのことの確認ソース--------------------- PipedReader pr = new PipedReader(); PipedWriter pw = new PipedWriter(pr); BufferedReader reader = new BufferedReader(pr); BufferedWriter writer = new BufferedWriter(pw); writer.write("あいうえお"); writer.newLine(); writer.write("かきくけこ"); writer.newLine(); writer.flush(); // writer.newLine()がないとブロックされてとまってしまう while (reader.ready()) { System.out.println(reader.readLine()); } writer.close(); reader.close();

その他の回答 (1)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

根本的に間違ってない? 通信プログラムなんだから普通はサーバとクライアントの2つのプログラムを書くべきだと思うけど。 一つのコネクションの送受信端を同じプログラム(プロセス)にしたテストサンプルを書いているという認識で良いのかな。 そうだとしてもコネクションの過程が質問のソースには記載されていないので正しく書かれているか確認できないね。 サーバソケットは接続待ち用でクライアントから接続(connect)されたらacceptで新たに通信用ソケットを作って返しているのだけど、そういう手順をきちんと理解して記述している?

ggaogg
質問者

補足

はい、サンプルとして、同じプロセス上でサーバとクライアントを実現しています。 サーバ待ち受け用のソケットを作成して、それを使用してacceptした結果のソケットが、例でいうところのsockServerになっています。 (そして待ち受けソケットはすでにcloseされている。) スレッド作成などいろいろと書いていると、許容文字数を容易に超えてしまうので、しかたなく必要最低限と思われる部分のみ抜粋しています。 局所的に見てわかるように、サーバ側のポートとクライアント側のポートを書いたつもりでしたが、待ち受けソケットのポートと接続ソケットのポート番号はやはり同じなので、やはり誤解を与えてしまいましたね・・。失礼しました。 今からtexjoyさんの回答を参考に試してみようとしているところです。 それで解決したら質問を締め切らせていただきます。

関連するQ&A

専門家に質問してみよう