Проблема ввода-вывода потока объекта, объект клиента не обновлен - PullRequest
1 голос
/ 27 декабря 2011

Я работаю над клиент-серверной игрой.Игра в основном характеризуется объектом Grid, который должен синхронизироваться между клиентами.Для этого я использую Object I / O Streams over Sockets.

Однако я сталкиваюсь с проблемой во время процесса синхронизации.Сетка отправляется и принимается всеми клиентами, но ее состояние не изменяется после первой загрузки каждому клиенту.

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

Вот (урезанные) фрагменты кода на стороне сервера:

while(true) //continuously accept new connections
     {
     //wait incoming connection, and accept it   
     Socket newSocket = serverListener.accept(); 

     //create player details and save it in hashtable
     Player newPlayer = new Player(newSocket); //streams saved here
     Players.put(newPlayer); 

     //update all clients
     sendGridToAll(); 
     }

Конструктор класса Player:

public Player(Socket s) throws IOException
    {
    this.Tx         = new ObjectOutputStream(socket.getOutputStream());
    this.Rx         = new DataInputStream(socket.getInputStream());
    }

Метод SendToAll:

public void sendGridToAll()
    {
    synchronized(Players) //do nothing while players HT is being modified
        {
        for(Enumeration e = Players.elements(); e.hasMoreElements(); )
            {
            Player tmpPlayer = (Player)e.nextElement();
            ObjectOutputStream tmpTx = tmpPlayer.getTx();

            try {
                tmpTx.writeObject(grid);
                }
            catch(IOException ex) 
                {
                ex.printStackTrace();
                }                
            }
        print.log("Grid update sent");
        }
    }

и вот фрагмент на стороне клиента, обрабатывающий получение объекта (запущенный в потоке):

public void run()
    {
    ObjectInputStream RX = new ObjectInputStream(socket.getInputStream());   

    while(true)
        {
        try 
            {
            RX_grid = (Grid)RX.readObject();
            }

        catch (IOException ex) 
            {
            print.log("IO Error");
            ex.printStackTrace();
            }

        catch (ClassNotFoundException ex) 
            {
            print.log("Bad grid class UID");
            }

        finally
            {
            print.log("grid recieved");
            c.updateGui(RX_grid);
            }
        }
    }

Спасибо за вашу помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...