【问题标题】:How to get amount of data in a DataInputStreaam? - Java如何获取 DataInputStream 中的数据量? - 爪哇
【发布时间】:2015-02-23 02:35:28
【问题描述】:

我目前正在编写我正在开发的多人游戏的服务器端。而且我需要知道服务器套接字上接收了多少数据,以便我可以循环浏览所有数据。例如,如果我执行 writeUTF() 两次,我将如何在不发生异常的情况下循环遍历它们?起初,我尝试使用 EOFException 进行尝试捕获。但你似乎无法抓住那些。那么,如何获取 DataInputStream 中接收的数据量?谢谢! -特伦特

附:如果您需要代码,请告诉我,我会放在这里!

【问题讨论】:

  • 简短回答:你不能。最简单的解决方案是为每个客户端设置一个单独的线程。
  • @immibis 好的,谢谢你的信息!生病只需要找到另一种方式发送它:)

标签: java networking server cycle multiplayer


【解决方案1】:

您从套接字读取数据的调用将被阻塞,直到接收到数据。无法找出流中有多少数据。您有几种方法可以解决这个问题,以下是一些建议:

  • 在您的通信协议中,包含一个长度字段或一些指示长度的命令代码。

  • 使用异步读写或使用专用线程处理通信。

  • 在开始使用键盘和代码之前,请考虑一下您的应用架构、其组件、它们的功能以及它们之间的关系。

【讨论】:

  • 感谢您的信息!我发现了另一种获取它的方法,我发现了 available() 方法,并使用了它。我以这种方式循环,并将所有数据放在一个 ArrayList 中,然后我使用 for 循环循环数据。
  • @SuperstarGamer-Trent JVM 可以让 available() 始终返回 0。有人会说 available() 是一个设计错误,如果今天发明了流,可能就不存在了。
  • @immibis 是的,我知道,通常情况下,我不会使用它。但是因为通过套接字发送的唯一数据是 UTF,所以我将使用它。否则,我不会。如果你想知道为什么我只发送字符串,那是因为我有一个库,我可以在其中制作类似于 ByteBuffer 的东西,除了变成字符串然后返回。是的,我可以将多头、短裤等放入其中。如果你愿意,我可以给你一个罐子的链接,你可以试试!
  • 使用 available 方法,您将不得不不断地轮询套接字,而不是被事件驱动。它应该可以工作。
  • @SuperstarGamer-Trent 我不明白您只发送字符串这一事实与您使用 available() 进行轮询这一事实有何关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 2017-08-01
  • 2022-01-08
  • 2022-11-16
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多