我正在尝试构建一个Java Bittorent客户端。据我所知,在同伴握手后,他们可能会开始互相发送消息,通常是偶尔发送消息。
使用 DataInputStream 连接,我可以读取消息,但是如果我调用读取并且对等方持有的流上没有任何内容。有没有办法判断是否正在通过流发送某些内容?或者我应该创建一个新线程,从每个对等方连续读取消息流,直到客户端关闭它们关闭?
我认为您需要进行一些重大实验,以便您可以开始学习套接字I/O的基础知识。 试图"按原样"回答您的问题是困难的,因为您还没有足够的理解力来以可以回答的方式提出问题。
如果希望能够判断是否有要读取的数据,则不应使用阻塞 I/O 方法。相反,您将需要使用称为"NIO"的API,它允许您"选择"具有要读取的数据的套接字(即与已包含数据的缓冲区关联的套接字)。
在你写了很多代码并把它搞砸了几次之后,这将更有意义。底层 I/O 原语实际上是非常原始的(双关语)。在这个行业中,我们只是编造了许多复杂的术语和函数名称以及API描述,以便人们认为网络通信是神奇的。不是。它通常不比 memcpy() 复杂。
C 中有一个名为 select()
的函数。在您所描述的场景中,您需要一个等效的 Java select
。也就是说,正如cpurdy提到的,非阻塞套接字I/O或NIO。粗略的谷歌搜索返回了以下链接:
- http://tutorials.jenkov.com/java-nio/socket-channel.html
- http://www.owlmountain.com/tutorials/NonBlockingIo.htm
- http://rox-xmlrpc.sourceforge.net/niotut/index.htm
想看看Netty项目:http://netty.io/
使用Netty很容易开始网络编程。