TCP Socket 實現文件上傳
文件上傳過程一個單向Socket通信過程。客戶端通過文件輸入流讀取文件,然后從Socket獲取輸出流寫入數據。服務端從Socket中獲得輸入流,然后寫入文件輸出流,寫入數據完成則上傳完成。
服務端UploadServer:
public class UplaodServer {
public static void main(String []args){
try(
// 創建一個ServerSocket監聽8080端口的請求
// ServerSocket 實現了 AutoCloseable接口, 可以自動釋放資源
ServerSocket server = new ServerSocket(8080);
// accept()會阻塞當前線程, 等待客戶端請求
Socket socket = server.accept();
// 獲取輸入流
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
// 由文件輸出流創建緩沖輸出流, 寫入本地upload.jpg 文件
FileOutputStream outputStream = new FileOutputStream("./upload.jpg")
){
// 緩沖區
byte [] buffer = new byte[1024];
int len = in.read(buffer);
while(len != -1){
// 寫入數據到文件
outputStream.write(buffer, 0, len);
// 再次從Socket中讀取數據
len = in.read(buffer);
}
System.out.println("文件已上傳");
}catch (IOException e) {
e.printStackTrace();
}
}
}
客戶端UploadClient:
public class UploadClient {
public static void main(String []args){
try(
// Socket 實現了 AutoCloseable接口 可自動關閉資源
Socket socket = new Socket("127.0.0.1", 8080);
// 又Socket獲得輸出流, 并創建緩沖輸出流
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
FileInputStream fileInput = new FileInputStream("F:\file\oxx6j5.jpg");
// 由文件輸入流創建緩沖輸入流
BufferedInputStream in = new BufferedInputStream(fileInputStream);
){
// 準備緩沖區
byte[] buffer = new byte[1024];
int len = in.read(buffer);
while (len != -1) {
// 寫入Socket
out.write(buffer, 0, len);
// 再次讀取文件
len = in.read(buffer);
}
System.out.println("上傳成功!");
}catch (ConnectException e) {
System.out.println("服務器未啟動");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意
server.accept()會阻塞線程,所以最好把server.accept()語句放入子線程中。

浙公網安備 33010602011771號