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

标签 java tcp java.util.scanner numberformatexception dataoutputstream

每当我尝试在短时间内发送太多消息(通常在 20 毫秒内发送超过 20 条消息)时,我的服务器/客户端 TCP 多人游戏就会出现问题。一段时间后,由于某种原因,消息开始损坏(例如用整数代替字符串,这通常会给我带来 NumberFormatException)。

我使用 DataOutputStream 以字符串形式发送信息,并使用扫描仪读取它们。

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

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

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

最佳答案

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

  • 如果您使用 DataOutputStream 写入数据,则应使用 DataInputStream 读取数据。并确保写入调用的顺序与读取调用的顺序完全匹配。

  • 如果您想使用扫描仪读取数据,则需要将数据格式化为文本,然后使用写入器写入。 (确保在两端使用相同的字符编码方案,并避免做一些令人讨厌的事情,例如通过 String(byte[]) 将二进制数据映射到文本......因为它们容易损坏。 )

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

<小时/>

至于 JSON 是否会给你带来更好的性能,你可能需要做一些实验才能确定。其中,这取决于数据的复杂性以及您选择在非 JSON 情况下对其进行编码的方式。 (但如果您选择适当的编码,我希望 DataOutputStream/DataInputStream 速度最快。)

关于java - 发送过多消息时服务器/客户端错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24345899/

相关文章:

java - 从键盘获取输入而不暂停程序

java - 使用 Scanner 将多个输入分配给多个变量

java - 如何对两个数据库使用 JTA 事务?

java - 在背景图像上设置动画

javascript - AngularJS 应用程序包含许多文件,由于最大 TCP 请求而停滞

sql-server - 无法连接到 Server 2008 R2 VM 上的 SQL Server;端口 1433 已打开

c++ - iOS 上的 TCP 流不显示在无线网络上

java - 如何使扫描仪返回定界符作为标记

Java DOM 解析器 : XMI - Inline Tag?

java - 如何从 matlab 代码运行 jar 文件?