每当我尝试在短时间内发送太多消息时,我的服务器/客户端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"。
答案 0 :(得分:1)
消息开始到达损坏
不,他们没有。消息不会损坏。你刚刚失去同步,因为你使用的是一个定义不明确的应用程序协议。按照@JimGarrison的建议,对称地使用DataInputStream和DataOutputStream。
答案 1 :(得分:1)
扩展@ EJP的答案,您遇到的损坏是某种应用程序编程错误的结果。
如果您使用DataOutputStream
来编写数据,则应使用DataInputStream
进行读取。并确保写调用序列与读调用序列完全匹配。
如果您想使用扫描仪阅读,则需要将数据格式化为文本,并使用Writer进行编写。 (确保在两端使用相同的字符编码方案,并避免做出令人讨厌的事情,例如通过String(byte[])
将二进制数据映射到文本......'因为它们往往会破坏。)
如果要使用多个读取/写入单个流的线程读取或写入数据,则需要使用某种锁定来确保消息正确/干净地交错。流通常不是线程安全的。
至于JSON是否会为您提供更好的性能,您可能需要做一些实验才能确定。除其他外,它将取决于数据的复杂性以及您选择在非JSON情况下对其进行编码的方式。 (但是如果选择合适的编码,我希望DataOutputStream / DataInputStream最快。)