2016-11-28 52 views
1

我需要創建一個應用程序,其中客戶端可以將消息(以對象的形式)發送到服務器,然後服務器將消息廣播到其他客戶端。通過套接字java將對象廣播到多個客戶端

我在接收來自服務器的消息的客戶端ObjectInputStream.readobject()有一些麻煩。在偵聽客戶端服務器的線程中,打印「等待讀取對象」以無限循環打印出來,但「讀取對象」和「打印」從不顯示。這是爲什麼?

線程上的客戶端監聽服務器

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){ 

     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 { 
      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

僅僅看着你的*短*代碼很難想象,沒有足夠的信息。 –

相關問題