java中有没有类似socketpair这样的接口?

dingdongbell
dingdongbell 2020-11-14 字数 131

Linux上的c++通过socketpair可以生成一对socket,可以进行本机的进程间通信,这一对socket也是文件描述符,不知道Java上有没有对应的实现呢?

Java Java技术
6 个回复
IcyFenix
).println("helloworld" 2020-11-14

java标准库里面没有提供UDS的支持,因为这个不是跨平台的,譬如windows下就没有UDS支持(PS:严谨一点查了下新闻,win10 17063之后支持UDS:https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/

这就像java同样不可能支持Windows消息这样的IPC手段,理由也同样是这个不是跨平台的。

所以,除了针对那些对通讯的成本特别敏感的场景,其他走回环设备是比较合适的方案。

如果确实需要用uds,有第三方库:

https://github.com/mcfunley/juds

https://github.com/kohlschutter/junixsocket

graceman
过眼云烟 2020-11-14

netty有unix channel

需要标准库的话

jep 380会增加unix socket到java中,和16一起发布,还得等半年

【 在 IcyFenix 的大作中提到: 】

: java标准库里面没有提供UDS的支持,因为这个不是跨平台的,譬如windows下就没有UDS支持(PS:严谨一点查了下新闻,win10 17063之后支持UDS:https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/

: 这就像java同样不可能支持Windows消息这样的IPC手段,理由也同样是这个不是跨平台的。

lambdai
lambdai 2020-11-14

java理论上可以在不支持的平台上抛exception啊…

话说socketpair没规定必须是uds吧

【 在 IcyFenix 的大作中提到: 】

: java标准库里面没有提供UDS的支持,因为这个不是跨平台的,譬如windows下就没有UDS支持(PS:严谨一点查了下新闻,win10 17063之后支持UDS:https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/

: 这就像java同样不可能支持Windows消息这样的IPC手段,理由也同样是这个不是跨平台的。

: ....................

dingdongbell
dingdongbell 2020-11-14

对,我现在就是用的Loopback,通过socket进行通信,不知道跟socketpair相比,效率如何,我总觉得用file descripor更靠谱一些

【 在 IcyFenix 的大作中提到: 】

: java标准库里面没有提供UDS的支持,因为这个不是跨平台的,譬如windows下就没有UDS支持(PS:严谨一点查了下新闻,win10 17063之后支持UDS:https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/

: 这就像java同样不可能支持Windows消息这样的IPC手段,理由也同样是这个不是跨平台的。

: 所以,除了针对那些对通讯的成本特别敏感的场景,其他走回环设备是比较合适的方案。

: ...................

IcyFenix
).println("helloworld" 2020-11-14

回环相比起uds的效率损失自然就是数据从网络栈中绕了一圈,逐层封包,触及回环设备,然后逐层解包,这个过程中计算某些包头包尾的信息,如校验和,以及netfilter中钩子路由(如有)都是相对耗时的。

但很难脱离具体场景去评价这样得效率损失高低、是否值得。如果真的要扣效率,uds也不是最高的ipc方式,尽管省略了网络栈,但数据还是要在用户态和内核态之间来回拷贝,这也是相对耗时的。

【 在 dingdongbell 的大作中提到: 】

: 对,我现在就是用的Loopback,通过socket进行通信,不知道跟socketpair相比,效率如何,我总觉得用file descripor更靠谱一些

poikilotherm
呆子 2020-11-17

共享内存效率会更好点?

【 在 IcyFenix 的大作中提到: 】

: 回环相比起uds的效率损失自然就是数据从网络栈中绕了一圈,逐层封包,触及回环设备,然后逐层解包,这个过程中计算某些包头包尾的信息,如校验和,以及netfilter中钩子路由(如有)都是相对耗时的。

: 但很难脱离具体场景去评价这样得效率损失高低、是否值得。如果真的要扣效率,uds也不是最高的ipc方式,尽管省略了网络栈,但数据还是要在用户态和内核态之间来回拷贝,这也是相对耗时的。