2014-02-07 1 views
0

В программе клиент-сервер У меня есть этот объект:Java: Написание и тот же объект с новыми параметрами в выходном потоке несколько раз

class MyTestingObject implements Serializable { 
    int number; 
    void updateParams() { 
     number++; 
    } 
    @Override 
    public String toString() { 
     return String.format("has value %03d", number); 
    } 
} 

Сервер делает новый экземпляр MyTestingObjectодин раз но в бесконечной loop он вызывает updateParams(), распечатывает его и отправляет его клиенту (с использованием ObjectOutputStream). Клиент также имеет бесконечный цикл, который печатает полученный объект (с использованием ObjectInputStream).

Что я ожидаю:

server: 
Sent "has value 1" 
Sent "has value 2" 
Sent "has value 3" 
Sent "has value 4" 

client: 
Got "has value 1" 
Got "has value 2" 
Got "has value 3" 
Got "has value 4" 

Но что я получаю:

server: 
Sent "has value 1" 
Sent "has value 2" 
Sent "has value 3" 
Sent "has value 4" 

client: 
Got "has value 1" 
Got "has value 1" 
Got "has value 1" 
Got "has value 1" 

Почему это происходит, и более важный вопрос, как я должен изменить его, чтобы заставить его работать, как я ожидал?

Если это помогает код тестера: (я знаю, что это не чисто и не написано в лучшем смысле):

public static void main(String[] args) { 
    (new Thread() { 
     MyTestingObject serverInstance = new MyTestingObject(); 

     { 
      serverInstance.number = 0; 
     } 

     @Override 
     public void run() { 
      try { 
       ServerSocket ss = new ServerSocket(8775); 
       Socket s = ss.accept(); 
       Client cl = new Client(); 
       cl.setSocket(s); 
       while (true) { 
        serverInstance.updateParams(); 
        cl.sendObject(serverInstance); 
        System.out.printf("Sent \"%s\"\n", serverInstance); 
       } 
      } catch (IOException ex) { 
       Logger.getLogger(NetworkSendSameObjectWithNewValuesSeveralTimes.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }).start(); 
    try { 
     Client cl = new Client("127.0.0.1", 8775); 
     cl.connect(); 
     while (true) { 
      try { 
       System.out.printf("Got \"%s\"\n", cl.readObject()); 
      } catch (IOException | ClassNotFoundException ex) { 
       Logger.getLogger(NetworkSendSameObjectWithNewValuesSeveralTimes.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(NetworkSendSameObjectWithNewValuesSeveralTimes.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
+0

возможно дубликат [Как пользоваться readObject() дважды в гнездо Java?] (Http://stackoverflow.com/questions/17009368/how-to-use-readobject-twice-in- socket-of-java) – EJP

ответ

1

Не видя вашего клиента и код сервера я не могу быть уверен, но я подозреваю, проблема заключается в том, как вы используете ObjectOutputStream.

This question is similar to yours with a good answer.

+0

Да. Этот вопрос был очень похож на мой, и его ответ решил мою проблему! Благодарю. –

+0

Без проблем, рад помочь! – theconsultingthief

Смежные вопросы