fsockopen 建立 TCP 連接,分塊讀取文件並發送ServerSocket 監聽,每連接啟動一線程 WebThread 接收寫入磁盤$fp = fsockopen("127.0.0.1", 1024, $errno, $errstr, 10);
$filename = '2012_07_23.zip';
fwrite($fp, $filename . "\r\n"); // 首行傳文件名
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
$data_size = 1024 * 1024; // 1MB 分塊
$data_count = ceil(strlen($contents) / $data_size);
for ($i = 0; $i < $data_count; $i++) {
$data = substr($contents, $i * $data_size, $data_size);
fwrite($fp, $data);
}
fclose($fp);
關鍵點:
\r\n 配合 Java readLine()read() 返回 -1 結束循環MyApp:監聽與分發ServerSocket server = new ServerSocket(1024);
for (;;) {
Socket client = server.accept();
new WebThread(client, i++).start(); // 每連接一線程
}
WebThread:接收寫入DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
String filename = in.readLine(); // 讀取文件名
String savePath = "E:\\" + filename;
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(savePath)));
byte[] buf = new byte[8192];
int read;
while ((read = in.read(buf)) != -1) {
out.write(buf, 0, read);
}
out.flush(); out.close(); in.close();
關鍵點:
BufferedOutputStream 為筆誤,一層即可read(buf) 返回實際讀取字節數,-1 表示流結束offset=0, len=read,避免殘留舊數據buf 大小(如 64KB)IOException 並記錄日志,確保資源 finally 關閉../../etc/passwd)PHP + Java Socket 跨語言文件傳輸,核心在於約定協議(首行文件名 + 二進制流)與流式分塊處理。示例代碼雖簡陋,但演示了完整鏈路。生產環境需在協議層、可靠性、安全性、併發模型上全面強化。