Я работаю над клиент-серверной игрой.Игра в основном характеризуется объектом 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);
}
}
}
Спасибо за вашу помощь