2013-12-08 200 views
0

我已经使用保存/加载游戏的工作代码通过套接字发送玩家状态。我遇到了一个问题,即保存游戏是正确的,但服务器没有收到客户端的玩家状态。未通过套接字发送XStream

下面是测试的基础代码和工作:

int retval = fc.showSaveDialog(givenComponent); 
    if (retval == JFileChooser.APPROVE_OPTION) { 
     File file = fc.getSelectedFile(); 
     try { 
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); 
      XStream xs = new XStream(); 
      GameSave gs = new GameSave(); 
      ArrayList<PlayerSerialize> listps = new ArrayList<PlayerSerialize>(); 
      for (Player tempplayer : Players.players) { 
       PlayerSerialize ps = new PlayerSerialize(); 
       ps.getPlayerData(tempplayer); 
       listps.add(ps); 
      } 
      gs.playersSerialize = listps; 
      gs.gamedate = Dateutils.gamedate; 
      String s = xs.toXML(gs); 
      bw.write(s); 
      bw.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(DialogMainField.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

这里是没有发送任何服务器的客户端代码:

XStream xs = new XStream(); 
    GameSave gs = new GameSave(); 
    ArrayList<PlayerSerialize> listps = new ArrayList<PlayerSerialize>(); 

    PlayerSerialize ps = new PlayerSerialize(); 
    ps.getPlayerData(Players.players.get(1)); 
    listps.add(ps); 
    gs.playersSerialize = listps; 
    gs.gamedate = Dateutils.gamedate; 
    String s = xs.toXML(gs); 
    out.println("clientplayertoserver"); 
    out.println(s); 

这里是服务器端刚刚在案例:

  if (strIn.contains("clientplayertoserver")) { 
       strIn = in.readLine(); 
       XStream xs = new XStream(); 
       GameSave gs = (GameSave) xs.fromXML(strIn); 
       Players.players.get(1).getPlayerSerializeData(gs.playersSerialize.get(0)); 
      } 

我需要某种线索,因为我卡住调查问题。是否有任何XStream限制?或者错误是在与套接字一起工作?相同的代码在一个地方工作,而不是在另一个地方工作 - 我非常感谢在这种奇怪的情况下提供任何帮助。

回答

0

好了,你在这里做两个不同的东西:

1)保存数据到一个文件,这是确定的。

2)通过套接字发送数据。您似乎认为所有的数据(XStream序列化对象)实际上都在一行中。通常情况并非如此。即使您将XStream配置为无标识地序列化所有数据,仍不能确定序列化数据(变量)中是否有换行符。

所以解决你的问题,你应该在这里分开你的顾虑。 1序列化/反序列化对象的字符串和背面(这似乎是为你工作。 第二发送这个数据的介质,如文件(你已经拥有)或服务器。

要发送的字符串数据到服务器,你需要某种协议,你可以重用一个现有的协议,比如HTTP(POST请求到服务器),Web服务,Rest Call或者其他你的服务器正在运行的任何其他服务器

If你想要实现你自己的协议(就像你上面已经尝试过的那样),你必须确保服务器知道应该如何处理它,通常你应该把请求分成一个头部和一个有效载荷部分或类似的东西。 加入你(例如,保存播放器状态)和其元信息(例如,您发送多少字节的有效载荷)。 标题后,发送有效载荷。 服务器现在必须读取头1(像所有东西,直到第一个换行符),解析头以了解正在发生的事情(例如,保存玩家状态,543字节数据)并对其执行操作(读取数据,将其转换为字符串,将XStream对象反序列化并将其存储在本地数据库中或服务器应该执行的操作)。

因此,毕竟这些信息,请调整您的问题。正如你所看到的,你对XStream没有任何疑问,但是关于如何将一些数据从客户端发送到定制服务器。

+0

是的,奇怪的是,XStream的或插槽分别工作: 1.我可以通过套接字换边并发送命令来启动游戏像 '}否则,如果(strIn.contains(“startgame”)){ DialogMultiplayerStart.callDispose(); DialogMainField.startNewGame(true,false,DialogMultiplayerStart.isFirstPlayerUSSR);' – lozga

+0

2.我可以保存游戏。Savig代码写在上面,游戏加载代码也很简单 'File file = fc.getSelectedFile(); XStream xs = new XStream(); GameSave gs =(GameSave)xs.fromXML(file); (int i = 0; i lozga

+0

如果可能会有帮助 - 这里是切换游戏端的工作代码,这是由相同的想法和工作: 服务器 '公共静态void sendSide(字符串端){ out.println(“side”) ; out.println(side); } Client: 'if(strIn.contains(“side”)){ strIn = in.readLine(); System.out.println(strIn); DialogMultiplayerStart.setSide(strIn); }' – lozga