使用带有选择器的非阻塞模式下的 Java NIO 和 Unix 域套接字
Posted
技术标签:
【中文标题】使用带有选择器的非阻塞模式下的 Java NIO 和 Unix 域套接字【英文标题】:Using Java NIO with Unix Domain sockets in non-blocking mode with selectors 【发布时间】:2012-02-05 15:01:12 【问题描述】:有没有办法在 Java NIO 中使用 Unix 域套接字? 我想使用 NIO,以便可以在单个线程中使用 Selectors。
我查看了junixsocket,但它似乎只支持普通套接字而不是支持选择器的 NIO 通道。
【问题讨论】:
【参考方案1】:您可以使用项目 jnr-unixsocket,(https://github.com/jnr/jnr-unixsocket),这是我见过的最先进的实现。它完全符合您的要求:nio 概念选择器、通道等
看@https://github.com/jnr/jnr-unixsocket/tree/master/src/test/java/jnr/unixsocket/example
【讨论】:
不客气。我设法用它从 nginx 代理读取和写入 http 请求到 unix 套接字域。【参考方案2】:JDK 16 内置了对 Unix 域套接字的支持。这里是an example from Oracle about using it with NIO
【讨论】:
很高兴听到这个消息。我正在做的项目早就完成了,但很高兴知道任何未来的项目。【参考方案3】:我确认XNIO 支持使用 Unix 域套接字,作为“本地套接字”。除了发行说明提及之外,还有:
JBoss 问题跟踪器中的corresponding task XNIO-48 Javadoc 完整源代码为available there但是没有一个 XNIO 通道实现SelectableChannel,所以我担心你将无法使用选择器。
我建议您在 XNIO 和 GNU ClassPath project 中发布一个问题来改善这种情况,其中 LocalSocket.getSocketChannel 返回 null
。
【讨论】:
谢谢。可惜XNIO没有实现Selectors,这是NIO的一大优势。 虽然答案不包括对选择器的支持,但它是最好的答案。 更新:从 XNIO 上的实际开发人员那里得到确认,实际上它不支持 Unix Domain Socket。接口定义了它,但实现还不存在。一个实现正在制作中...... 所以等等……你的回答说你确认 XNIO 支持 unix 套接字,但是这里有一条评论说它不支持。你们中只有一个是正确的。在这个问题得到解决之前,我不赞成这个答案。 哇,这是一个相当古老的线程。在那个时候,XNIO API 有一个允许你选择 unix 套接字的接口,但是我得到了一位开发人员的回复,说实现仍然不可用。也许这已经改变了,自从我问到现在已经快 2 年了。以上是关于使用带有选择器的非阻塞模式下的 Java NIO 和 Unix 域套接字的主要内容,如果未能解决你的问题,请参考以下文章
Java网络编程——NIO的阻塞IO模式非阻塞IO模式IO多路复用模式的使用