为什么Socket使用流,但NIO SocketChannel使用读/写?

问题描述:

我正在尝试编写一个非阻塞客户端/服务器,我注意到Socket提供了getInputStream()getOutputStream(),但SocketChannel提供了read()write()为什么Socket使用流,但NIO SocketChannel使用读/写?

下面的问题都是相关的,是为了更好地了解情况:

  • 为什么这些对象如何提供分组数据有什么不同?
  • 这是否是阻塞vs非阻塞的副作用还是简单的 的实施?
  • 这是我在决定如何从套接字读取时需要考虑的事情吗?
  • 我可以收到一个不完整的数据包,其缓冲区在任一实施中的结束时间早于预期吗?
+0

有没有这样的事情'NIO套接字'。 – EJP

为什么这些对象在提供分组数据的方式上有所不同?

因为否则它们将是相同的。 NIO的设计者认为他们必须将数据,位置,容量和限制封装到一个类中。

这是阻塞VS非阻塞的副作用还是简单的不同实现?

不,是的。

这是我在决定如何从套接字读取时需要考虑的事情吗?

当然。

我可以收到一个不完整的数据包,其中缓冲区结束时间比预期的要早吗?

是的。这是TCP/IP的属性,而不是Java的属性。