示範使用 Java Socket 實現檔案傳輸,包含自定義二進制協議、多執行緒伺服器處理多客戶端、流式讀寫與壓縮傳輸技巧。協議格式:檔名長度(4 bytes) - 檔名 - 檔案長度(4 bytes) - 檔案內容。
ListenThread) 接受連線,每連線啟動 HandleThread 解析協議並存檔。// ListenThread
ServerSocket server = new ServerSocket(listenPort);
while (true) {
Socket socket = server.accept();
new HandleThread(socket).start();
}
// HandleThread.readAndSave()
String filename = getFileName(is); // 讀 4 bytes 長度 + 檔名 bytes
int file_len = readInteger(is); // 讀 4 bytes 檔案長度
readAndWrite(is, os, file_len); // 4096 bytes 緩衝區循環讀寫
// 發送檔名
byte[] fn_bytes = file.getName().getBytes();
os.write(i2b(fn_bytes.length)); // 4 bytes 長度
os.write(fn_bytes); // 檔名內容
// 發送檔案內容
os.write(i2b(length)); // 4 bytes 檔案長度
while ((size = is.read(buffer)) != -1) {
os.write(buffer, 0, size); // 分塊發送
}
b2i(byte[]) / i2b(int):大端序 (Big-Endian) 4 bytes 整數與 byte 陣列互轉。ZipOutputStream / ZipInputStream 可輕易加入壓縮傳輸 (程式碼中已預留)。readAndWrite 未處理 read() 回傳 -1 (連線提前關閉) 的情況。Integer.MAX_VALUE (約 2GB)。