みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Javaのネットワークに関して

一つのサーバから複数のクライアントにメッセージを送るようにしなさい。いくつのクライアントと接続するか
は入力により動的に決めるようにすること。複数のクライアントとの通信にはそのソケットを配列やコンテナを使って実装すればよい。サ
ーバを「No23ex04Server」としクライアントを「No23ex04Client」とすること。
とあります。
以下のコードでクライアント側のプログラムは一切変えなくてよいそうなので、サーバー側のプログラムを以下のようにしたのですが、acceptが呼ばれている時点で、ループが止まってしまうので、入力待機状態になりません。スレッドを使わなくてもできるそうなのですが、私にはさっぱりです。

public class No23ex04Client {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
String cIpAddress = null;
String hostName = null;
String sIpAddress = null;
int portNo = 65535;

try {
cIpAddress = InetAddress.getLocalHost().getHostAddress();
hostName = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {

}

System.out.println("Client IP Address : " + cIpAddress);
System.out.println("Host Name : " + hostName);

Scanner scn = new Scanner(System.in);
System.out.print("Server IP Address? : ");
sIpAddress = scn.next();
System.out.print("Server Port Number? : ");
portNo = scn.nextInt();
System.out.println("■Start■");

try {
Socket sc = new Socket(sIpAddress, portNo);
BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream()));

while (true) {
System.out.print("From Server Message : ");
String fromServerMessage = br.readLine();
System.out.println(fromServerMessage);

if (fromServerMessage.contains("さようなら")) break;
}

sc.close();
} catch (IOException e) {
e.printStackTrace();
}

System.out.println("■Shutdown■");
}

}

public class No23ex04Server {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
String ipAddress = null;
String hostName = null;
int portNo = 65535;

try {
ipAddress = InetAddress.getLocalHost().getHostAddress();
hostName = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e){

}

System.out.println("IP Address : " + ipAddress);
System.out.println("Host Name : " + hostName);

Scanner scn = new Scanner(System.in);
System.out.print("Port Number? : ");
portNo = scn.nextInt();
System.out.print("Socket Number? : ");
int num = scn.nextInt();
System.out.println("■Start■");

try {
ServerSocket ssc = new ServerSocket(portNo);
System.out.println("Serverが起動(Port Number : " + ssc.getLocalPort() + ")");
Socket[] sc = new Socket[num];
BufferedWriter[] bw = new BufferedWriter[num];

for (int i = 0; i < num; i++) {
sc[i] = ssc.accept();
System.out.println("接続" + i + " : " + sc[i].getRemoteSocketAddress());

bw[i] = new BufferedWriter(new OutputStreamWriter(sc[i].getOutputStream()));
}

while (true) {
System.out.print("To Client Message : ");
String toClientMessage = scn.next();

for (BufferedWriter b : bw) {
b.write(toClientMessage);
b.newLine();
b.flush();
}

if (toClientMessage.contains("さようなら")) break;
}

for (Socket s : sc) s.close();
} catch (IOException e) {
e.printStackTrace();
}

System.out.println("■Shutdown■");
}

}

投稿日時 - 2013-07-15 17:48:53

QNo.8177547

すぐに回答ほしいです

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

>ループが途中で止まっているみたいです。

わたしがなぜ簡略化して

>for (int i = 0; i < num; i++) {
>sc[i] = ssc.accept();
>}

と書いてるか考えませんか?
ServerSocket#acceptはクライアントからの接続要求を受けるまで待機するんですよね?
で、クライアントは1つしか起動してないんですよね?

まず最初に指定した数のクライアントからの接続要求を待つようにコーディングしてるんですから接続要求するクライアントが1つしかないなら2つ目以降のクライアントからの要求を待つのは当然ではないですか。

投稿日時 - 2013-07-16 01:44:42

補足

それではプログラムは動かないんですが

投稿日時 - 2013-07-16 03:38:46

お礼

すみません。
新たにコンソールをクライアント数分用意し、それぞれクライアントを立ち上げたら、うまくいきました。
致命的なミスだったようです。
今までの回答ありがとうございました。

投稿日時 - 2013-07-16 04:54:15

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

>確かクライアントからの要求を待機するだった気がします

では

for (int i = 0; i < num; i++) {
sc[i] = ssc.accept();
System.out.println("接続" + i + " : " + sc[i].getRemoteSocketAddress());
bw[i] = new BufferedWriter(new OutputStreamWriter(sc[i].getOutputStream()));
}

が、何をやってるかはわかるんでは?
簡略化して

for (int i = 0; i < num; i++) {
sc[i] = ssc.accept();
}

でもいいですけど。
クライアント側のプログラムはいくつ起動してますか?

投稿日時 - 2013-07-15 20:55:17

補足

1つです。
まずループ一回目で1つのクライアントと接続されますが、
要求待ちなので、次のループに行かず入力処理までに処理が行かないのが現状です。
ループが途中で止まっているみたいです。
Javaは並行して接続できないそうで、スレッドを使うのが普通なそうですが、使わないでやるそうなので。

投稿日時 - 2013-07-15 21:13:20

ANo.2

一対多の通信が出来ればいいので、サーバ側は標準入力にこだわらなくてもいいと思うよ。

投稿日時 - 2013-07-15 20:39:06

補足

どういうことですか?

投稿日時 - 2013-07-15 20:42:51

ANo.1

ServerSocket#acceptは何をするのか理解していますか?

投稿日時 - 2013-07-15 20:06:04

補足

確かクライアントからの要求を待機するだった気がします

投稿日時 - 2013-07-15 20:36:27

あなたにオススメの質問