クライアントがメッセージを(オブジェクトの形式で)サーバーに送信して、そのメッセージを他のクライアントにブロードキャストできるアプリケーションを作成する必要があります。ソケットjavaを使用して複数のクライアントにオブジェクトをブロードキャストする
ObjectInputStream.readobject()
で、サーバーからメッセージを受信しているクライアントで問題が発生しています。クライアントサイドのサーバをリッスンするスレッドでは、 "オブジェクトを読み込むのを待っている"という印刷が無限ループで印刷されますが、 "読み取りオブジェクト"と "印刷済み"は決して表示されません。何故ですか?
クライアントからのメッセージを読んで、それらに(サーバー側)放送、サーバ、クライアント側に
while(!terminate){
String message = scanner.nextLine();
if(message.equals("logout")){
terminateProgram();
return;
}
ChatMessage msg = new ChatMessage(name,message);
try {
os.writeObject(msg);
os.flush();
} catch (IOException e) {
System.err.println("Sending message to server failed: " + e.getMessage());
}
}
を書くサーバー
while (!terminate){
try {
System.out.println("Waiting to read object");
ChatMessage msg = (ChatMessage) is.readObject();
System.out.println("Read object");
System.out.println(msg.toString());
System.out.println("Printed");
} catch (IOException e) {
e.getMessage();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
を聞いて、クライアント側のスレッド
while (!terminate) {
try {
Object obj = is.readObject();
if (obj instanceof ChatMessage) {
ArrayList<Socket> sockets = SingletonModel.getInstance().getSockets();
for (Socket socketOne : sockets) {
if (socket != socketOne) {
System.out.println("We here");
os = new ObjectOutputStream(socketOne.getOutputStream());
os.writeObject(obj);
os.flush();
System.out.println("We done");
}
}
クライアントのIOExceptionを適切に処理することが適切な場合があります。 –