同一台机器上两个进程(源自C和Java)之间通信的套接字

Socket to communicate between two processes (originated from C and Java) on the same machine

我需要将数据从一个进程传输到另一个进程。
当这两个进程起源于 C 代码时,我对这个主题非常熟悉——我没有一次使用 C 代码中的文件、信号和管道来完成它,但我从来没有尝试在一个起源的两个进程之间做这件事来自 Java 代码,另一个来自 C 代码。

由于以上所有方法都需要(Linux) native API,而且JVM也在路上,所以我决定使用socket来实现这两个进程之间的通信,并且我有几个问题:

  1. 使用套接字在同一台机器上的两个进程之间进行通信有多普遍?
  2. 没有指定 "Server" 和 "Client" 是否会设置任何障碍(实现方面)?

我问的原因是我在网上阅读的所有地方,总是有一个进程定义为 'server',一个进程定义为 'client'。我的情况并非如此。另外,我从未尝试为此目的使用套接字。

  1. 您可能想要使用 Java Native Interface。这可能正是您想要的。 - 基于您在两个程序上使用套接字的方法。

  2. 您可能想查看 linux 上的共享内存。

但是: 一般来说,在这里使用套接字并不是一件坏事,但我怀疑这是常见的做法*。

*我缺乏证据证明这不是常见的做法。

使用 Socket 可以轻松实现以与语言和平台无关的方式将 2 个进程连接在一起。它受所有语言和平台支持,并且可以根据需要轻松替换为其他方法。

根据您的解释,我了解到 Java 进程是服务器。 Sockets 完全没有风险,因为它们不需要特殊权限(至少对于超过 1024 的端口)或任何其他特殊处理。

在设计您的进程将通过其进行通信的(应用程序级别)协议时请注意。

  1. How common is it to use socket to communicate between two processes on the same machine?

某些 class 交互模式很常见:当两个独立启动的程序需要双向通信通道时。您不能轻易地为此使用管道("independently-launched" 干扰)。可以用FIFO,但是需要两个,需要有人设置,还有其他怪癖。

  1. Does the fact that there is no designated "Server" and "Client" can set any obstacles (implementation-wise)?

"client" 与 "server" 之间的区别首先是关于建立通信中的角色:服务器设置通信接口并等待一个或多个客户端打开到它的连接.作为 "server" 并不一定意味着支持多个客户端(既不是并发的也不是连续的),也不一定意味着在建立套接字连接后通过套接字连接进行通信。如果你使用套接字那么你 do 有客户端和服务器,但是如果你没有其他方法来指定哪个进程应该有哪个角色那么你可以任意选择。

Java 中套接字的一个技巧是,尽管 Java 标准库支持它们,但它仅支持 network 套接字,不支持 UNIX 域套接字.后者在 UNIX 和 Linux 应用程序中更常用,在这些应用程序中,通信本质上仅限于同一台机器上的进程 运行,但是侦听(仅)环回接口的网络套接字也可以达到该目的.

在现代系统上,本地 TCP 连接与 UNIX 域套接字一样快,因此使用它们不是问题。