【问题标题】:What's the proper way to continuously read socket messages through DataInputStream?通过DataInputStream连续读取套接字消息的正确方法是什么?
【发布时间】:2014-04-03 01:47:45
【问题描述】:

我正在尝试构建一个 Java Bittorent 客户端。据我了解,在同伴相互握手后,他们可能会开始互相发送消息,通常是零星地发送消息。

使用 DataInputStream 连接我可以读取消息,但如果我调用读取并且对等方持有的流上没有任何内容。有没有办法可以判断是否正在通过流发送内容?或者我应该创建一个新线程来连续读取来自每个对等方的消息流,直到客户端将它们关闭关闭?

【问题讨论】:

    标签: java sockets bittorrent datainputstream


    【解决方案1】:

    我认为你需要做一些重要的实验,这样你才能开始学习套接字 I/O 的基础知识。尝试“按原样”回答您的问题很困难,因为您还没有足够了解以可以回答的方式提出问题。

    如果您希望能够判断是否有数据要读取,那么您不应该使用阻塞 I/O 方法。相反,您将需要使用称为“NIO”的 API,它允许您“选择”具有要读取数据的套接字(即与其中已有数据的缓冲区关联的套接字)。

    在您编写了大量代码并将其搞砸几次之后,这将更有意义。底层 I/O 原语实际上非常原始(双关语)。在这个行业里,我们只是编造了很多复杂的术语和函数名称以及 API 描述,以至于人们会认为网络通信很神奇。它不是。它一般不会比 memcpy() 复杂。

    【讨论】:

      【解决方案2】:

      C 中有一个名为select() 的函数。在您描述的场景中,您需要 Java 中的 select 等效项。也就是说,正如 cpurdy 提到的,非阻塞套接字 I/O 或 NIO。粗略的谷歌搜索返回以下链接:

      【讨论】:

        【解决方案3】:

        您可能想看看 Netty 项目:http://netty.io/

        使用 Netty 开始网络编程非常容易。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-23
          相关资源
          最近更新 更多