В программе клиент-сервер У меня есть этот объект: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);
}
}
возможно дубликат [Как пользоваться readObject() дважды в гнездо Java?] (Http://stackoverflow.com/questions/17009368/how-to-use-readobject-twice-in- socket-of-java) – EJP