首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 伺服器應用:資料報接收與 C 程式管道協作管理郵件列表

     編輯:Java 相關知識

為何選擇資料報而非 TCP

UDP 無連線特性讓單一 DatagramSocket 即可監聽所有客戶請求,無需多執行緒併發控制,也避免多執行緒寫入同一檔案的鎖定複雜度。封包遺失時客戶端自行重送即可。

Java 與 C 程式互操作:Runtime.exec() 管道模式

Java 1.0 缺乏方便的檔案文字處理,改用 C 程式 listmgr.exe 管理列表。Java 以 Runtime.getRuntime().exec("listmgr.exe") 啟動子程式,取得:

  • Process.getOutputStream() → 包裝為 PrintStream → 寫入 Email(標準輸入)。
  • Process.getInputStream() → 包裝為 DataInputStream → 讀取處理結果(標準輸出)。
此法適用於任何能讀 stdin/寫 stdout 的程式,無需 JNI 複雜度。

C 程式邏輯

listmgr.c 開啟 emlist.txt(a+t),無限迴圈 gets(buf) 讀 stdin,alreadyInList() 掃描檔案比對(以 <email> 格式避免部分匹配),存在則回「Already in list」,否則寫入檔案並回「added to list」。fflush(stdout) 確保即時回應。

Java 伺服器主迴圈

while(true) {
    socket.receive(dp);
    String rcvd = new String(dp.getData(), 0, 0, dp.getLength());
    nameList.println(rcvd.trim()); nameList.flush(); // 送給 C 程式
    byte[] resultBuf = new byte[BUFFER_SIZE];
    int byteCount = addResult.read(resultBuf); // 讀 C 程式回應
    // 封裝回應 DatagramPacket,提取 dp.getAddress()/getPort() 回覆原發送者
    socket.send(echo);
}

關鍵點:回應封包的目標位址/埠號直接從接收封包 dp 取得,無需自行追蹤客戶端資訊。C 程式需在伺服器原生環境編譯(如 Linux/gcc)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved