2016-11-28 4 views
1

クライアントがメッセージを(オブジェクトの形式で)サーバーに送信して、そのメッセージを他のクライアントにブロードキャストできるアプリケーションを作成する必要があります。ソケット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"); 
        } 

       } 
+0

クライアントのIOExceptionを適切に処理することが適切な場合があります。 –

答えて

0

あなたのコードにはObjectInputStream.readobject()が見つかりましたが、それは記載されていますが、表示されませんでした。あなたが取得する必要があり、クライアント側では

class Message implements Serializable{ 
    public String getMessage(){ 
    return "message"; 
} 
} 

ServerSocket serverSocket = new ServerSocket(3451); 
    Socket server = serverSocket.accept(); 
    ObjectOutputStream outs = new ObjectOutputStream(server.getOutputStream()); 
      outs.writeObject(new Message()); 

:サーバー側で

あなたは、このように(オブジェクト シリアル化するために忘れないようにメモして)オブジェクトを送信しますこのようなオブジェクト

// or, Socket client = new Socket(InetAddress.getLocalHost(), 3451); 
Socket client = new Socket("localhost", 3451); 
InputStream inFromServer = client.getInputStream(); 
    ObjectInputStream ins = new ObjectInputStream(inFromServer); 
      try { 
       Message message= (Message) ins.readObject(); 
      } catch (ClassNotFoundException ex) { } 
+0

ObjectInputStreamは、最初のコード例の "is"変数です。私はあなたの実装に自分のコードを変更しましたが、それでも無限ループで "オブジェクトの読み込みを待っています"という出力が出ています。 – Malu123

+0

あなたの非常に短いコードを見て、情報が不足していると考えるのは難しいです。 –

関連する問題