【问题标题】:Use the underlying Socket/ServerSocket in a SocketChannel/ServerSocketChannel?在 SocketChannel/ServerSocketChannel 中使用底层的 Socket/ServerSocket?
【发布时间】:2011-11-23 11:04:49
【问题描述】:

我正在尝试使用 Java.nio-package 进行非阻塞通信。所以我在 Selector 中获取了我的 ServerSocketChannel 和所有连接的客户端 (SocketChannel),并使用 Selector.select() 等待数据 (OP_ACCEPT/OP_READ)。

我的问题是:我可以使用底层 Socket,而不是使用 ByteBuffer 并直接使用 SocketChannel.read() 读取,获取 InputStream 并使用该流读取吗?还是会弄乱选择器的东西?

【问题讨论】:

  • read() 是一个阻塞操作。只有 NIO 可以用于阻塞或非阻塞模式。 IO 只是阻塞。

标签: java selector nio


【解决方案1】:

你不能。

http://download.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#getInputStream%28%29

如果此套接字具有关联的通道,则生成的输入流会将其所有操作委托给通道。如果通道处于非阻塞模式,则输入流的读取操作将抛出 IllegalBlockingModeException。

【讨论】:

  • 啊——好吧。我真的不喜欢 SocketChannel 和 ByteBuffer 的工作方式。我只想读取 n 个字节,但 SocketChannel.read() 只能读取直到 ByteBuffer 已满,或者直到 SocketChannel 中没有更多数据。有没有一种简单的方法来读取 n 个字节?
  • @Simon 未处于非阻塞模式。
猜你喜欢
  • 2011-02-10
  • 2015-04-11
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2011-10-09
  • 2014-12-21
  • 2012-10-30
  • 2020-06-09
相关资源
最近更新 更多