У меня есть объект TestEllipse
в моем классе клиента, который расширяет Ellipse2D.Double
, который отправляется на сервер. Сервер вызывает свой метод updatePosition
, обертывает его в ArrayList и отправляет ArrayList клиенту. updatePosition
добавляет 10 к x-координате эллипса.Изменение объекта в сервере не отражается на клиенте
Странно, что даже если вызывается updatePosition
, когда клиент получает эллипс в ArrayList, координата x его позиции, похоже, не изменилась. Обновленное положение показано на сервере ...
[TestEllipse[x=60,y=250]]
[TestEllipse[x=70,y=250]]
[TestEllipse[x=80,y=250]]
[TestEllipse[x=90,y=250]]
[TestEllipse[x=100,y=250]]
... но не в клиенте:
[TestEllipse[x=60,y=250]]
[TestEllipse[x=60,y=250]]
[TestEllipse[x=60,y=250]]
[TestEllipse[x=60,y=250]]
[TestEllipse[x=60,y=250]]
Почему это так, и как я могу получить обновленную позицию для показа в клиенте?
На стороне сервера:
import java.awt.geom.Ellipse2D;
import java.io.*;
import java.net.*;
import java.util.*;
public class TestServer {
public static void main(String[] args) {
try {
List<TestClient.TestEllipse> list = new ArrayList<TestClient.TestEllipse>();
ServerSocket listener = new ServerSocket(31362);
Socket socket = listener.accept();
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
while (true) {
try {
TestClient.TestEllipse e = (TestClient.TestEllipse) ois.readObject();
if (e != null)
list.add(e);
for (TestClient.TestEllipse ellipse : list)
ellipse.updatePosition();
// System.out.println(list);
oos.writeObject(list);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
А на стороне клиента:
import java.awt.geom.Ellipse2D;
import java.io.*;
import java.net.Socket;
import java.util.*;
public class TestClient {
public static void main(String[] args) {
try {
List<TestEllipse> list = new ArrayList<TestEllipse>();
TestEllipse t = new TestEllipse(50, 250);
Socket socket = new Socket("localhost", 31362);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
while (true) {
try {
oos.writeObject(t);
t = null;
list = (List<TestEllipse>) ois.readObject();
// System.out.println(list);
Thread.sleep(500);
} catch (ClassNotFoundException | InterruptedException ex) {
ex.printStackTrace();
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static class TestEllipse extends Ellipse2D.Double {
int x, y;
public TestEllipse(int x, int y) {
super(x,y,10,10);
this.x = x;
this.y = y;
}
public void updatePosition() {
x += 10;
}
@Override
public String toString() {
return "TestEllipse[x="+x+",y="+y+"]";
}
}
}
Спасибо! Это именно то, что я искал. – TNT