【发布时间】:2010-11-20 11:12:25
【问题描述】:
我刚开始使用 java.nio 并且可能使用了一些错误的方式,所以我遇到了一点问题。
我正在尝试编写一个类似于端口转发器的东西,它可以使用各种附加模块修改通过它的流量。
这是我的做法:
ConnectionManager - 一个线程 有它自己的选择器 注册到 OP_ACCEPT 服务器套接字通道。每当它 选择任何东西 - 它创建一个 ConnectionProcessor 对象 管理连接。
ConnectionProcessor - 一个线程 打开 SocketChannel 到 预定义的前进点(在哪里 从新发送数据包 连接的客户端)。然后它打开 它是自己的选择器并注册它 到客户端的 SocketChannel 的 OP_READ 和服务器的 SocketChannel 的 OP_READ。
然后处理器进入无限循环,从选择器中选择数据并适当地转发。为了确定将数据发送到哪里,它将 SelectionKey.channel() 与 clientChannel 和 serverChannel 进行比较。
ConnectionProcessor 中的选择是在 5 秒的超时 (select(5000)) 下进行的 - 以处理超时。当 select 超时时 - 它会尝试从两个通道中读取以获取异常或 -1 结果。
现在这是我的问题/问题:
- 使用key.cancel()对不对 处理密钥后?最多 我在网上看到的例子 只需从 selectedKeys() 列表。键.取消() 似乎是更好的方法。
-
有几个对吗 基本上使用 同样的ServerSocketChannel?或者我应该总是使用单个选择器并传递选定的键 合适的经理?我什么 意思是如果 3 个客户端连接 同时,这就是 会发生:
a) 经理创建处理器。 处理器打开客户端通道。 处理器注册它自己的 选择器到客户端通道。 b) (a) c) 重复 (一)
- 出于某种原因,即使一个客户端连接到我的转发器后 - 它也不会处理 消息快于 5000 毫秒超时。它开始选择,锁定 5 秒钟,然后走 到第二次迭代并获取我在上次超时期间收到的 5-6 条消息。 我应该责怪 (1)、(2) 还是其他原因?
- 是否有任何手册说明所有 nio 的内部工作原理?我是那种只有在完全理解了底层机制之后才能理解如何使用事物的人。阅读 API 并没有帮助,因为它是为已经知道正确使用 nio 的人编写的。
感谢您阅读我的整个问题,并提前感谢您的帮助。
【问题讨论】:
-
嗯...所以如果我将某些内容放入通道并尝试同时从中进行选择,它在选择完成之前不会发送任何数据?太吓人了,去看看 XNIO 和 MINA。感谢您的建议。
-
不,他没有这么说。他指的是处理写入时出现的各种问题,并且有多种处理方式。最简单的技术是在选择线程中进行所有内联写入,但即使这样也有其怪癖。
标签: java multithreading sockets nio