UDP 無連線特性讓單一 DatagramSocket 即可監聽所有客戶請求,無需多執行緒併發控制,也避免多執行緒寫入同一檔案的鎖定複雜度。封包遺失時客戶端自行重送即可。
Java 1.0 缺乏方便的檔案文字處理,改用 C 程式 listmgr.exe 管理列表。Java 以 Runtime.getRuntime().exec("listmgr.exe") 啟動子程式,取得:
Process.getOutputStream() → 包裝為 PrintStream → 寫入 Email(標準輸入)。Process.getInputStream() → 包裝為 DataInputStream → 讀取處理結果(標準輸出)。listmgr.c 開啟 emlist.txt(a+t),無限迴圈 gets(buf) 讀 stdin,alreadyInList() 掃描檔案比對(以 <email> 格式避免部分匹配),存在則回「Already in list」,否則寫入檔案並回「added to list」。fflush(stdout) 確保即時回應。
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)。