質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

829閲覧

javaのsocketでlineみたいにみたいにメッセージのやり取りがしたい

novaEX

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/04/04 20:18

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
server側からメッセージを送ると、すぐにclient側にメッセージが表示されるのに
client側からメッセージ送ったら、server側からメッセージ送るのと連動して送ったものがserver側に表示されます。

発生している問題・エラーメッセージ

コマンドプロンプトの画面 client側 server側 ↓↓↓↓ clientで「aaaaa」と入力 aaaaa client側     server側 ↓↓↓↓ serverで「bbbbb」と入力 aaaaa サーバーからの回答:bbbbb client側 bbbbb クライアントで入力された文字=aaaaa server側

該当のソースコード

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.io.PrintWriter; 5import java.net.InetSocketAddress; 6import java.net.ServerSocket; 7import java.net.Socket; 8 9class Server { 10 11 void runSample() { 12 13 ServerSocket sSocket = null; 14 Socket socket = null; 15 BufferedReader reader = null; 16 PrintWriter writer = null; 17 BufferedReader csInput = null; 18 19 try{ 20 //IPアドレスとポート番号を指定してサーバー側のソケットを作成 21 sSocket = new ServerSocket(); 22 sSocket.bind(new InetSocketAddress 23 ("127.0.0.1",8765)); 24 25 System.out.println("クライアントからの入力待ち状態"); 26 27 //クライアントからの要求を待ち続けます 28 socket = sSocket.accept(); 29 30 //クライアントからの受取用 31 reader = new BufferedReader( 32 new InputStreamReader 33 (socket.getInputStream())); 34 35 //サーバーからクライアントへの送信用 36 writer = new PrintWriter( 37 socket.getOutputStream(), true); 38 39 //サーバー側での入力用 40 csInput = new BufferedReader 41 (new InputStreamReader(System.in)); 42 43 44 45 //無限ループ byeの入力でループを抜ける 46 String line = null; 47 String row = null; 48 while (true) { 49 50 line = reader.readLine(); 51 row = csInput.readLine(); 52 53 if (line.equals("bye")) { 54 break; 55 } 56 57 //送信用の文字を送信 58 writer.println(row); 59 60 System.out.println("クライアントで入力された文字=" + line); 61 } 62 }catch(Exception e){ 63 e.printStackTrace(); 64 }finally{ 65 try{ 66 if (reader!=null){ 67 reader.close(); 68 } 69 if (writer!=null){ 70 writer.close(); 71 } 72 if (csInput != null) { 73 csInput.close(); 74 } 75 if (socket!=null){ 76 socket.close(); 77 } 78 if (sSocket!=null){ 79 sSocket.close(); 80 } 81 System.out.println("サーバー側終了です"); 82 } catch (IOException e) { 83 e.printStackTrace(); 84 } 85 } 86 } 87 88} 89 90public class Runserver { 91 public static void main(String[] args) { 92 Server s1 = new Server(); 93 s1.runSample(); 94 } 95} 96 97import java.io.BufferedReader; 98import java.io.IOException; 99import java.io.InputStreamReader; 100import java.io.PrintWriter; 101import java.net.Socket; 102 103class Client { 104 105 void runSample() { 106 107 Socket cSocket = null; 108 BufferedReader csInput = null; 109 PrintWriter writer = null; 110 BufferedReader reader = null; 111 112 try{ 113 //IPアドレスとポート番号を指定してクライアント側のソケットを作成 114 cSocket = new Socket("127.0.0.1", 8765); 115 116 //クライアント側での入力用 117 csInput = new BufferedReader 118 (new InputStreamReader(System.in)); 119 120 //クライアント側からサーバへの送信用 121 writer = new PrintWriter 122 (cSocket.getOutputStream(), true); 123 124 //サーバ側からの受取用 125 reader = new BufferedReader 126 (new InputStreamReader 127 (cSocket.getInputStream())); 128 129 //無限ループ byeの入力でループを抜ける 130 String line = null; 131 String row = null; 132 while (true) { 133 134 line = csInput.readLine(); 135 136 row = reader.readLine(); 137 138 //byeの入力でループを抜ける 139 if (line.equals("bye")) { 140 break; 141 } 142//送信用の文字を送信 143 writer.println(line); 144 145 146 //サーバ側からの受取の結果を表示 147 System.out.println 148 ("サーバーからの回答:" + row); 149 } 150 }catch(Exception e){ 151 e.printStackTrace(); 152 }finally{ 153 try { 154 if (reader != null) { 155 reader.close(); 156 } 157 if (writer != null) { 158 writer.close(); 159 } 160 if (csInput != null) { 161 csInput.close(); 162 } 163 if (cSocket != null) { 164 cSocket.close(); 165 } 166 } catch (IOException e) { 167 e.printStackTrace(); 168 } 169 System.out.println("クライアント側終了です"); 170 } 171 } 172 173} 174public class Runclient { 175 public static void main(String[] args) { 176 Client s1 = new Client(); 177 s1.runSample(); 178 } 179}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/04/04 21:57

問題はなんでしょうか。 そして、それをどうしたいんでしょう
novaEX

2021/04/05 05:53

lineみたいに自由におくりたいです。
novaEX

2021/04/05 17:36

メッセージを送信するのと受信するのをそれぞれ任意の時間にさせたい。
guest

回答1

0

line = reader.readLine();

row = csInput.readLine();

readLineは1行のデータが読み込めるまで待ちます
これでは、readerに1行のデータが来るまで待ち、そのあと、csInputに1行のデータが読み込まれるまで待つ、という動作となります

これでお望みの動作を行うことはできませんね。

投稿2021/04/05 00:43

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

novaEX

2021/04/05 05:56

ではそれをどうすればできますか? while文に条件式でも入れて送信と受信の操作を独立させる必要があるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問