2015-04-30 2 views
0

У меня есть объект 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+"]"; 
     } 
    } 
} 

ответ

0

Если написать один и тот же объект несколько раз в данной ObjectOutputStream поток записывает объект один раз, и затем записывает ссылку на объект в последующие моменты времени. Это позволяет отправлять циклические графики объектов ObjectOutputStream.

Чтобы убедиться, что обновленные объекты отправляются вместо ссылок, вам необходимо позвонить reset() в поток.

+0

Спасибо! Это именно то, что я искал. – TNT

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