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

Java Socket 檔案傳輸實作:自定義協議實現多執行緒伺服器與客戶端

     編輯:Java 相關知識

示範使用 Java Socket 實現檔案傳輸,包含自定義二進制協議、多執行緒伺服器處理多客戶端、流式讀寫與壓縮傳輸技巧。協議格式:檔名長度(4 bytes) - 檔名 - 檔案長度(4 bytes) - 檔案內容。

架構概覽

  • FileTransmission:主程式,啟動伺服器 (Port 7788) 與客戶端測試。
  • Server:監聽執行緒 (ListenThread) 接受連線,每連線啟動 HandleThread 解析協議並存檔。
  • Client:讀取本地檔案,依協議寫入 Socket 輸出串流。

伺服器端核心邏輯

// 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)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved