发送过多消息时发生服务器/客户端错误

时间:2014-06-21 21:10:58

标签: java tcp java.util.scanner numberformatexception dataoutputstream

每当我尝试在短时间内发送太多消息时,我的服务器/客户端TCP多人游戏都有问题(通常在20毫秒的弧线中发送超过20条消息)。一段时间后,由于某种原因,消息开始被破坏(比如用整数代替字符串,这通常会让我产生NumberFormatException)。

我使用DataOutputStream将信息作为字符串发送,并使用扫描程序读取它们。

        inputStream = socket.getInputStream();
        outputStream = socket.getOutputStream();
        in = new Scanner(inputStream);
        out = new DataOutputStream (outputStream);

我的问题是:我应该使用与DataOutputStream / Scanner组合不同的东西吗?有更快的组合吗?我应该在发送之前将字符串转换为字节吗?

我发送的字符串通常由整数和字符串组成,例如" m 2 215 123"或" ep 2"。

2 个答案:

答案 0 :(得分:1)

  

消息开始到达损坏

不,他们没有。消息不会损坏。你刚刚失去同步,因为你使用的是一个定义不明确的应用程序协议。按照@JimGarrison的建议,对称地使用DataInputStream和DataOutputStream。

答案 1 :(得分:1)

扩展@ EJP的答案,您遇到的损坏是某种应用程序编程错误的结果。

  • 如果您使用DataOutputStream来编写数据,则应使用DataInputStream进行读取。并确保写调用序列与读调用序列完全匹配。

  • 如果您想使用扫描仪阅读,则需要将数据格式化为文本,并使用Writer进行编写。 (确保在两端使用相同的字符编码方案,并避免做出令人讨厌的事情,例如通过String(byte[])将二进制数据映射到文本......'因为它们往往会破坏。)

  • 如果要使用多个读取/写入单个流的线程读取或写入数据,则需要使用某种锁定来确保消息正确/干净地交错。流通常不是线程安全的。


至于JSON是否会为您提供更好的性能,您可能需要做一些实验才能确定。除其他外,它将取决于数据的复杂性以及您选择在非JSON情况下对其进行编码的方式。 (但是如果选择合适的编码,我希望DataOutputStream / DataInputStream最快。)