2013-04-20 2 views
0

내 클라이언트가 연결할 수있는 채팅 서버를 만들었지 만 클라이언트가 다른 사람이 보낸 메시지를받지 못합니다. 이것은 모든 것을 수행하는 코드입니다. 출력 스트림을 보내고 받고 설정하기.소켓의 arraylist에있는 데이터를 보내는 중

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>(); 

각 클라이언트가 연결되면 소켓에이 목록이 저장됩니다. 이 작업을 수행하는 더 좋은 방법이 있다면 알려주십시오.

답변

0

원격 클라이언트 인 경우 MulticastSocket이 트릭을 수행 할 수 있습니다. 로컬 클라이언트 인 경우 HornetQ과 같은 게시/가입 메시징 서비스가 작동합니다 (클라이언트가 메시지 대기열에 가입하고 HornetQ가 라우팅을 담당 함).

0

반복 변수를 사용하지 않으면 루프의 포인트가 표시되지 않습니다. 확실히 ClientConnector.Connections.get(i)으로 보내야합니까?

또 다른 문제는 모든 반복마다 ObjectInputStreamObjectOutputStream을 새로 만드는 것입니다. 그것은 작동하지 않습니다. 양쪽 소켓에서 각 소켓의 수명 동안 소켓 당 동일한 스트림 쌍을 사용해야합니다.

관련 문제