2013-04-20 165 views
0

我已經創建了一個聊天服務器,我的客戶端可以連接到該客戶端但客戶端不會收到對方發送的消息。這是完成這一切的代碼。發送和接收並設置輸出流。將數據發送到套接字列表中的套接字

public void run() 
{ 
    while(true) 
    { 
     for(int i = 0; i < ClientConnector.Connections.size(); i++) 
     { 

      try 
      { 
       if(Socket != null) 
       { 
        ObjectOutputStream Output = new ObjectOutputStream(Socket.getOutputStream()); 
        ObjectInputStream Input = new ObjectInputStream(Socket.getInputStream()); 
        whileChatting(Input, Output); 
       } 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public static void sendMessage(String message, String returnedMessage, ObjectOutputStream out) 
{ 
    try 
    { 
     System.out.println("[Server] " + message); 
     if(!message.isEmpty()) 
     { 

      out.writeObject("\247c[Server]\247d " + message); 
      out.flush(); 
      System.out.println("[Chat] Sent: " + message); 
     } 
     else 
     { 
      out.writeObject(returnedMessage); 
      System.out.println("[Chat] Sent: " + returnedMessage); 
     } 
     out.flush(); 
     System.out.println("[Info] Flushing remaining data to stream."); 

    } 
    catch(IOException ioException) 
    { 
     System.out.println("[Warning] Error: ioException @ sendMessage line 76."); 
    } 
} 

public static void whileChatting(ObjectInputStream input, ObjectOutputStream output) throws IOException 
{ 
    String message = ""; 
    do 
    { 
     try 
     { 
      message = (String) input.readObject(); 
      System.out.println(message); 
      sendMessage("", message, output); 
     } 
     catch(ClassNotFoundException classNotFoundException) 
     { 
      System.out.println("[Warning] Error: ClassNotFoundException @ whileChatting line 1-7."); 
      System.out.println("idk wtf that user sent!"); 
     } 
    }while(!message.equals("/stop")); 
} 

我想知道。我如何讓這個人發送給所有客戶?我在套接字數組列表中保留了一個套接字列表。看起來像這樣。

public static ArrayList<Socket> Connections = new ArrayList<Socket>(); 

當每個客戶端連接它時,它將它的Socket存儲到這個列表中。如果有更好的方法,請讓我知道。

回答

0

如果這些是遠程客戶端,那麼MulticastSocket可能會伎倆。如果這些客戶端是本地客戶端,那麼像HornetQ這樣的發佈/訂閱消息服務就可以工作(客戶端訂閱消息隊列,HornetQ負責路由)。

0

當您不使用迭代變量時,我沒有看到循環的重點。當然你應該發送到ClientConnector.Connections.get(i)

此處的另一個問題是,您在每次迭代時都會創建一個新的ObjectInputStreamObjectOutputStream。這是行不通的。您必須在每個套接字的兩端使用同一對每個套接字的流。