簡體   English   中英

用於在同一計算機上的兩個進程(源自C和Java)之間進行通信的套接字

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

我需要將數據從一個過程轉移到另一個過程。
當兩個進程源自C代碼時,我對這個主題非常熟悉-一次沒有使用C代碼中的文件,信號和管道來完成它,但是我從來沒有嘗試過在兩個進程之間起源一個進程來自Java代碼,另一個來自C代碼。

由於上述所有方法都需要(Linux)本機API,並且JVM正在使用中,所以我決定使用套接字在這兩個進程之間進行通信,我有兩個問題:

  1. 使用套接字在同一台計算機上的兩個進程之間進行通信有多普遍?
  2. 沒有指定的“服務器”和“客戶端”的事實是否可以設置障礙(在實現方面)?

我問的原因是,在我在線閱讀的所有內容中,總是有一個進程定義為“服務器”,而一個進程定義為“客戶端”。 在我的情況下情況並非如此。 另外,我從未嘗試為此目的使用套接字。

  1. 使用套接字在同一台計算機上的兩個進程之間進行通信有多普遍?

對於某些類型的交互模式,這很常見:當兩個獨立啟動的程序需要雙向通信通道時。 您不能輕易地為此使用管道(“獨立啟動”會產生干擾)。 您可以使用FIFO,但需要兩個,有人需要設置它們,還有其他怪癖。

  1. 沒有指定的“服務器”和“客戶端”的事實是否可以設置障礙(在實現方面)?

“客戶端”與“服務器”之間的區別首先在於建立通信的角色:服務器設置通信接口,並等待一個或多個客戶端打開與之的連接。 成為“服務器”並不一定意味着支持多個客戶端(並發或串行支持),也不一定意味着與建立套接字后通過套接字連接的通信有關。 如果使用套接字,則確實具有客戶端和服務器,但是如果沒有其他方法指定哪個進程應該具有哪個角色,則可以任意選擇。

Java中套接字的一個技巧是,盡管Java標准庫支持它們,但它僅支持網絡套接字,而不支持UNIX域套接字。 后者更常用於UNIX和Linux應用程序,在這些應用程序中,通信本質上僅限於在同一計算機上運行的進程,但是偵聽(僅)回送接口的網絡套接字也可以達到該目的。

在現代系統上,本地TCP連接與UNIX域套接字一樣快,因此使用它們不是問題。

使用Socket可以輕松實現以語言和平台不可知的方式將2個進程連接在一起。 它受所有語言和平台的支持,並且可以根據需要輕松替換為另一種方法。

從您的解釋中,我了解到Java進程將是服務器。 Sockets是完全無風險的,因為它們不需要特殊權限(至少對於超過1024的端口)或任何其他特殊處理。

在設計您的流程將通過其進行通信的(應用程序級別)協議時,只需注意一下。

  1. 您可能要使用Java本機接口 這可能正是您想要的。 -根據您在兩個程序上都使用套接字的方式。

  2. 您可能要研究Linux上的共享內存。

但是:通常,在這里使用套接字並不是一件壞事,但我懷疑這是常見的做法*。

*我缺乏證明,這不是慣例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM