我需要将数据从一个流程传输到另一个流程 当这两个过程源自C代码时,我对这个主题非常熟悉 - 不是一次我使用C代码中的文件,信号和管道来完成它,但我从来没有尝试在两个进程之间做到这一点来自Java代码,另一个来自C代码。
由于上述所有方法都需要(Linux)本机API,并且JVM正在进行中,我决定使用套接字在这两个进程之间进行通信,我有几个问题:
我问的原因是,我在网上阅读的所有地方,总有一个流程定义为“服务器”,一个流程定义为“客户端”。在我的情况下情况并非如此。另外,我从未试图为此目的使用套接字。
答案 0 :(得分:3)
- 使用socket在同一台机器上的两个进程之间进行通信有多常见?
醇>
对于某类交互模式而言非常普遍:当两个独立启动的程序需要双向通信通道时。你不能轻易使用管道("独立启动"干扰)。你可以使用FIFO,但你需要两个,有人需要设置它们,还有其他的怪癖。
- 是否没有指定" Server"和"客户"可以设置任何障碍(实施方式)?
醇>
"客户"之间的区别与#34;服务器"首先是关于建立通信的角色:服务器设置通信接口并等待一个或多个客户端打开与它的连接。作为一个"服务器"并不一定意味着支持多个客户端(既不是并发也不是串行),也不一定意味着在建立后通过套接字连接的通信。如果你使用套接字然后你做有客户端和服务器,但如果你没有其他方法来指定哪个进程应该具有哪个角色,那么你可以任意选择。
Java中的套接字的一个技巧是虽然Java标准库支持它们,但它仅支持网络套接字,而不支持UNIX域套接字。后者更常用于UNIX和Linux应用程序,其中通信本质上仅限于在同一台机器上运行的进程,但是(仅)环回接口的网络套接字也可以用于此目的。
在现代系统上,本地TCP连接与UNIX域套接字一样快,因此使用它们不是问题。
答案 1 :(得分:2)
使用Socket
可以轻松地以语言和平台无关的方式将2个进程连接在一起。它受到所有语言和平台的支持,如果需要,可以很容易地用其他方法替换。
根据您的解释,我收集了Java进程将是服务器。 Sockets
非常无风险,因为他们不需要特殊权限(至少超过1024个端口)或任何其他特殊处理。
在设计流程将要通过的(应用程序级别)协议时,请注意。
答案 2 :(得分:0)
您可能想要使用Java Native Interface。它可能正是你想要的。 - 基于你的方法在两个程序上使用套接字。
您可能希望在linux上查看共享内存。
但是一般来说,使用套接字并不是件坏事,但我怀疑它是常见的做法*。
*我缺乏证据,这不是常见的做法。