文本文件上傳**必須使用字元流**(Reader/Writer)配合緩衝區,確保換行符、編碼正確處理。與圖片上傳的位元組流本質不同。
import java.io.*;
import java.net.*;
public class TCPTextServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8090);
System.out.println("文本上傳服務端啟動,監聽 8090...");
Socket client = server.accept();
System.out.println("客戶端連接:" + client.getInetAddress());
try (
InputStream in = client.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream("E:/tcp.txt"), "UTF-8"));
OutputStream out = client.getOutputStream()
) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine(); // 跨平台換行
bw.flush(); // 及時寫入磁碟
}
// 回應
out.write("上傳完成...".getBytes("UTF-8"));
out.flush();
} finally {
client.close();
server.close();
}
}
}
import java.io.*;
import java.net.*;
public class TCPTextClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8090);
System.out.println("已連接服務端");
try (
OutputStream out = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(out, "UTF-8"));
BufferedReader br = new BufferedReader(new FileReader("1.txt"));
) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
// 關鍵:發送結束標記
socket.shutdownOutput();
// 接收回應
try (InputStream in = socket.getInputStream()) {
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println("服務端回應:" + new String(buf, 0, len, "UTF-8"));
}
} finally {
socket.close();
}
}
}
客戶端 服務端
FileReader (字元輸入) InputStreamReader (位元組→字元)
↓ ↓
BufferedReader (緩衝讀行) BufferedReader (緩衝讀行)
↓ ↓
OutputStreamWriter (字元→位元組) BufferedWriter (緩衝寫行)
↓ ↓
Socket OutputStream FileOutputStream (位元組寫檔)
| 維度 | 文本上傳 | 圖片上傳 |
|---|---|---|
| 流類型 | 字元流 + 轉換流 + 緩衝區 | 位元組流 + 緩衝區 |
| 編碼處理 | 指定 UTF-8/GBK,雙端一致 | 無編碼,純二進位透傳 |
| 換行處理 | readLine()/newLine() 自動適配 | 不涉及 |
| 結束標記 | shutdownOutput() 必須 | shutdownOutput() 必須 |
| 錯誤 | 後果 | 修正 |
|---|---|---|
| 文本用位元組流 | 中文亂碼、換行符損壞 | 改用 Reader/Writer 指定編碼 |
漏寫 shutdownOutput() | 服務端 readLine() 永久阻塞 | 發送完畢後必須調用 |
| 雙端編碼不一致 | 中文顯示亂碼 | 雙端明確指定相同 Charset |
未 flush() | 數據停留緩衝區,文件不全 | 關鍵節點調用 flush() |
TCP 文本上傳核心模式:**字元流轉換鏈 + 緩衝區逐行讀寫 + shutdownOutput() 邊界 + 統一編碼**。掌握此模式,可輕鬆擴展至配置文件同步、日誌收集、代碼部署等場景。生產環境建議加入協議幀(長度前綴/分隔符)、壓縮、加密、斷點續傳等增強特性。