| 方式 | 適用場景 | 優點 | 缺點 | 複雜度 |
|---|---|---|---|---|
| Web Service (REST/SOAP) | 跨網路、異構系統、微服務 | 標準化、防火牆友善、語言無關、支援異步 | 序列化開銷、延遲較高、需維護合約 | 中 |
| Socket (TCP/UDP) | 高效能、即時通訊、遊戲、金融 | 低延遲、全雙工、自定義協議、效能最佳 | 需自行處理幀邊界、重連、協議設計、安全性 | 高 |
| JNI (Java Native Interface) | 呼叫 C/C++ 庫、硬體驅動、高效能運算 | 直接記憶體存取、零拷貝、效能極致 | 極難除錯、JVM 崩潰風險、平台相關、編譯部署複雜 | 極高 |
| JACOB / JNA (COM/.NET 互通) | Windows 平台呼叫 COM 元件、.NET 組件、Office 自動化 | 無需寫 C++ 封裝、直接對應 COM 介面 | 僅限 Windows、效能較 JNI 低、需註冊 DLL、32/64 位元坑多 | 中高 |
| 共享檔案/資料庫 | 批次處理、異步解耦、舊系統整合 | 簡單、鬆耦合、可視化、支援大量資料 | 輪詢延遲、並發鎖競爭、資料一致性難保證、安全性風險 | 低 |
Java 端 (Spring Boot):
@RestController
@RequestMapping("/api/data")
public class DataController {
@PostMapping("/sync")
public ResponseEntity syncData(@RequestBody DataDTO dto) {
// 業務邏輯
return ResponseEntity.ok(Result.success());
}
}
Python/Go/Node.js 客戶端:使用標準 HTTP 庫 (requests, net/http, axios) 呼叫。
關鍵點:定義 OpenAPI/Swagger 合約、使用 JSON Schema 驗證、實作冪等性與重試機制。
Java 伺服端 (Netty):
public class TcpServer {
public void start(int port) {
EventLoopGroup boss = new NioEventLoopGroup(1);
EventLoopGroup worker = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap().group(boss, worker)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer() {
@Override protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(
new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4), // 自定義協議解碼
new JsonDecoder(), // 自訂 JSON 解碼器
new BusinessHandler() // 業務處理
);
}
});
b.bind(port).sync().channel().closeFuture().sync();
} finally { boss.shutdownGracefully(); worker.shutdownGracefully(); }
}
}
C++/Go 客戶端:對應相同協議 (長度前綴 + JSON/Protobuf) 發送/接收。
步驟:
避坑指南:使用 `GetPrimitiveArrayCritical`/ `ReleasePrimitiveArrayCritical` 避免陣列拷貝、妥善處理例外 (`ExceptionCheck`)、32/64 位元 JVM 必須對應編譯同位元庫。
前置條件:Windows、註冊 `jacob.dll` (放入 `java.library.path`)、目標 COM 元件已在系統註冊 (`regsvr32`)。
// 呼叫 .NET 組件 (需 COM Visible)
ActiveXComponent dotNet = new ActiveXComponent("MyDotNetLib.MyClass");
Variant result = dotNet.invoke("MyMethod", new Variant("param1"), new Variant(123));
System.out.println(result.getString());
// 自動化 Excel
ActiveXComponent excel = new ActiveXComponent("Excel.Application");
excel.setProperty("Visible", new Variant(true));
Dispatch workbooks = excel.getProperty("Workbooks").toDispatch();
Dispatch workbook = Dispatch.call(workbooks, "Add").toDispatch();
// ... 操作儲存格
Dispatch.call(workbook, "SaveAs", new Variant("C:\\test.xlsx"));
excel.invoke("Quit");