電子書籍の厳選無料作品が豊富!

お世話になります。
今、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

A 回答 (2件)

Writerで出力した後、


Writer#newLine();
Writer#flush();
メソッドを呼んでください。
    • good
    • 0
この回答へのお礼

解決しました。ありがとうございました。
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();

お礼日時:2007/11/06 13:18

根本的に間違ってない? 通信プログラムなんだから普通はサーバとクライアントの2つのプログラムを書くべきだと思うけど。


一つのコネクションの送受信端を同じプログラム(プロセス)にしたテストサンプルを書いているという認識で良いのかな。

そうだとしてもコネクションの過程が質問のソースには記載されていないので正しく書かれているか確認できないね。
サーバソケットは接続待ち用でクライアントから接続(connect)されたらacceptで新たに通信用ソケットを作って返しているのだけど、そういう手順をきちんと理解して記述している?

この回答への補足

はい、サンプルとして、同じプロセス上でサーバとクライアントを実現しています。

サーバ待ち受け用のソケットを作成して、それを使用してacceptした結果のソケットが、例でいうところのsockServerになっています。
(そして待ち受けソケットはすでにcloseされている。)

スレッド作成などいろいろと書いていると、許容文字数を容易に超えてしまうので、しかたなく必要最低限と思われる部分のみ抜粋しています。

局所的に見てわかるように、サーバ側のポートとクライアント側のポートを書いたつもりでしたが、待ち受けソケットのポートと接続ソケットのポート番号はやはり同じなので、やはり誤解を与えてしまいましたね・・。失礼しました。
今からtexjoyさんの回答を参考に試してみようとしているところです。
それで解決したら質問を締め切らせていただきます。

補足日時:2007/11/06 12:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!