2016-09-29 48 views
0

我正在用Java编写我的游戏。这是一款多人游戏,整个通信正在通过服务器。每个客户端< - >服务器套接字链接在单独的威胁中工作。我在java套接字中反序列化我的arraylist对象失败

服务器类持有的客户在这个数组中:

public ClientServerThread clients[]; 

我还储藏室保存玩家和游戏对象

public ArrayList<GameRoom> channels; 

我在服务器上创建一个游戏,并发送整场比赛物CO 2客户端(主机和客人)是这样的:

   Message carry on info about players and their choices about army. 
        */ 
       msgOut = new Message(Message.START_GAME, "SERVER", Message.OK, "ROOM: " + gameRoom.getName()); 
       /* 
       Creating a game 
       */ 
       ArrayList<Player> players = gameRoom.getPlayers(); 
       //Assiging players 
       //Creating game - generate map, deal cards - setup army etc. 
       Game game = new Game(players); 
       //setting game in gameRoom on server. 
       gameRoom.setGame(game); 
       //Setting msg to carry whole game 
       msgOut.setGame(game); 
       //Sending response to both clients in room; 
       server.announceInRoom(gameRoom, msgOut); 

我仔细检查调试 - 游戏对象厕所很好。 主持人和嘉宾都应该获得带有整个数组列表的游戏对象,在这种情况下,它将是单位军队。

控制台调试(看军队尺寸):

server.send() {type='START_GAME', sender='SERVER', content='OK', recipient='ROOM: dddGame:Host Player:adads,Nation:1,**Army size:8** Guest Player:dcfvv,Nation:7,**Army size:8** Map: [email protected]'} PortID: 53780 
server.send() {type='START_GAME', sender='SERVER', content='OK', recipient='ROOM: dddGame:Host Player:adads,Nation:1,Army size:8 Guest Player:dcfvv,Nation:7,Army size:8 Map: [email protected]'} PortID: 53781 

在客户端,我有消息处理

   case Message.START_GAME: 
        if(msg.getContentP() == Message.OK) 
        { 

        Game game = msg.getGame(); 

        /* Create and display the form */ 
        java.awt.EventQueue.invokeLater(new Runnable() { 
         public void run() { 
          try { 
           if(currentPlayer.isHost()) 
           { 
            clientGame = new GameWindow(game , SocketClient.this, CreateRoomWindow.AS_HOST); 
           } 
           else 
           { 
            clientGame = new GameWindow(game, SocketClient.this, CreateRoomWindow.AS_GUEST); 
           } 

           clientGame.setVisible(true); 
           roomWindow.setVisible(false); 
          } catch (Exception ex) { 
           Logger.getLogger(GameWindow.class.getName()).log(Level.SEVERE, null, ex); 
          } 
         } 
        }); 
        } 
        break; 

问题是,在反序列化后,我不明白整场比赛的对象, 主机客户端缺少ArrayList hostarmy和ArrayList guestArmy

控制台调试:(查看军队规模)

Outgoing : {type='START_GAME', sender='adads', content='Start Game', recipient='SERVER'} 
Incoming : {type='START_GAME', sender='SERVER', content='OK', recipient='ROOM: dddGame:Host Player:adads,Nation:1,**Army size:0** Guest Player:dcfvv,Nation:7,**Army size:0** Map: [email protected]'} 

奇怪的来宾客户端获得的ArrayList guestArmy但没有主机军:/

Incoming : {type='START_GAME', sender='SERVER', content='OK', recipient='ROOM: dddGame:Host Player:adads,Nation:1,**Army size:0** Guest Player:dcfvv,Nation:7,**Army size:8** Map: [email protected]'} 

我设置每个参与类的serialVersionUID。即将用完的想法

我错过了什么?

+0

您可以发布您的类'Message',也表明你是怎么通过插座给他们? – haifzhan

+0

你可以发布你的游戏类吗? – MGorgon

+0

让我们不要经历大量代码,其中大部分代码与您的问题无关,而是最好简化问题并创建并发布有效的[mcve]。 –

回答

0

我是线程和访问/引用内存分配的东西。

我学的这篇文章:Java concurency

和synchronized关键字没有帮助我很多。

我深入挖掘并决定在发送给客户端之前尝试克隆游戏对象。我已经红了那篇文章:Java deep copies techniques,并决定使用UnoptimizedDeepCopy,因为它在同步函数上运行 - 并且工作。

现在我的代码看起来像这样

   Game game = new Game(players2); 
       Game game2 = (Game) UnoptimizedDeepCopy.copy (game); 
       msgOut.setGame(game2);