2016-11-28 17 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

Трудно думать, просто глядя на ваши очень короткие коды, информации недостаточно. –