![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
お世話になります。
今、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
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_06.png?e8efa67)
No.1ベストアンサー
- 回答日時:
Writerで出力した後、
Writer#newLine();
Writer#flush();
メソッドを呼んでください。
解決しました。ありがとうございました。
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();
No.2
- 回答日時:
根本的に間違ってない? 通信プログラムなんだから普通はサーバとクライアントの2つのプログラムを書くべきだと思うけど。
一つのコネクションの送受信端を同じプログラム(プロセス)にしたテストサンプルを書いているという認識で良いのかな。
そうだとしてもコネクションの過程が質問のソースには記載されていないので正しく書かれているか確認できないね。
サーバソケットは接続待ち用でクライアントから接続(connect)されたらacceptで新たに通信用ソケットを作って返しているのだけど、そういう手順をきちんと理解して記述している?
この回答への補足
はい、サンプルとして、同じプロセス上でサーバとクライアントを実現しています。
サーバ待ち受け用のソケットを作成して、それを使用してacceptした結果のソケットが、例でいうところのsockServerになっています。
(そして待ち受けソケットはすでにcloseされている。)
スレッド作成などいろいろと書いていると、許容文字数を容易に超えてしまうので、しかたなく必要最低限と思われる部分のみ抜粋しています。
局所的に見てわかるように、サーバ側のポートとクライアント側のポートを書いたつもりでしたが、待ち受けソケットのポートと接続ソケットのポート番号はやはり同じなので、やはり誤解を与えてしまいましたね・・。失礼しました。
今からtexjoyさんの回答を参考に試してみようとしているところです。
それで解決したら質問を締め切らせていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- オープンソース Try Kotlinで readLine()を使うには 1 2023/03/27 21:06
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- 国産車 新型COROLLAの前から見たデザイン。 どう思いますか。 新型COROLLAの斜め前から見たデザイ 8 2022/05/14 06:14
- Gmail 【お助け!】サーバーからのメール送信でGmailに送信されない問題について 1 2023/06/20 22:03
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Ruby vscode 文字化け 1 2022/05/21 19:17
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- 英語 この英文の意味を教えてください 3 2023/07/07 20:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
[JAVA]try 内の変数を外で!?
-
改行の判定方法
-
nullcline
-
Webアプリケーション checkbox...
-
JAVA 文字色変更
-
エクセルマクロ文で、赤文字セ...
-
EclipseでJava
-
Collectionからの型変換について
-
javaの文字化けに困っています。
-
java シンボルが見つかりません...
-
(急募)Java 三択クイズをGUI(...
-
ソケット:書き出しをソケット...
-
ループ処理の際、最後だけ","を...
-
パソコンキーボードで時分秒を...
-
BOOL値を逆にしたい
-
ダブルクォーテーションのrepla...
-
yyyymmddからyyyy/mm/d...
-
<s:iterator>の値をリストで取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
[JAVA]try 内の変数を外で!?
-
JAVAのDouble型の小数点以下の...
-
「続行するには何かキーを押し...
-
EclipseでJava
-
文字列の引き算
-
JAVAのエラーの意味が分かりま...
-
配列を後ろから数えるには?
-
JAVAで素数判定
-
nullcline
-
曜日の取得方法を教えて下さい!
-
エクセルマクロ文で、赤文字セ...
-
JAVA 文字色変更
-
会員情報登録プログラムの作成...
-
Javaのコマンドライン引数を使...
-
Javaでカレントディレクトリを...
-
LC発振回路-ループ利得
-
java シンボルが見つかりません...
-
改行の判定方法
おすすめ情報