通过DataInputStream连续读取套接字消息的正确方法是什么?

时间:2014-04-03 01:47:46

标签: java sockets bittorrent datainputstream

我正在尝试构建一个Java Bittorent客户端。据我所知,在同伴互相握手之后,他们可能会开始互相发送消息,经常偶尔发送消息。

使用DataInputStream连接我可以读取消息,但是如果我调用一个读取,并且流上没有任何内容,则对等端保持。有没有办法告诉我是否通过流发送了什么?或者我应该创建一个新的线程,从每个对等端连续读取消息流,直到客户端关闭它们为止?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

Netty很容易开始进行网络编程。