教育路上
摘要:Java TCP 案例 文件上傳 ,要使用 TCP 協議來實現。接下來通過一個案例來實現圖片上傳的功能,首先編寫服 務器端程序,。以下是我們為大家整理的,相信大家閱讀完后肯定有了自己的選擇吧。
2022-05-18 16:40網絡推薦
運行結果如圖 13-21 所示。
例 13-13 中創建一個 ServerSocket 對象在 while(true)無限循環中調用 ServerSocket
的 accept()方法來接收客戶端的請求,每當和一個客戶端建立 Socket 連接后就開啟一個新
的線程和這個客戶端進行交互。開啟的新線程是通過實現 Runnable 接口創建的,重寫 run()
方法中實現了服務器端接收并保存客戶端上傳圖片的功能在代碼的第 24 行,對上傳圖片的
保存目錄用一個 File 對象進行封裝,如果這個目錄不存在就調用 File 的 mkdir()方法創建
這個目錄。為了避免存放的圖片名重復而造成新上傳的圖片把已存在的圖片覆蓋,在代碼的
第 21 行定義了一個整型變量 count,用于統計圖片的數目,使用"IP 地址(count).jpg"作
為上傳圖片的名字。在代碼的第 30~33 行對表 count++。最后將從客戶端接收的圖片信息寫
人到指定的日錄中,在代碼的第 40 行和第 41 行獲得服務器端的輸出流,向客戶端輸出"上
傳成功"信息。通過圖 13-21 運行結果可以看出,服務器端進人阻塞狀態,等待客戶端連接。
完成了服務器端程序的編寫,下面來編寫客戶端上傳程序,如例 13-14 所示。
例 13-14 Example08.java
import java.io.*;
import java.net.*;
public class Example08 {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 10001); // 創建客戶端 Socket
OutputStream out = socket.getOutputStream(); // 獲取 Socket 的輸出流對象
// 創建 FileInputStream 對象
FileInputStream fis = new FileInputStream("D:\\1.jpg");
byte[] buf = new byte[1024]; // 定義一個字節數組
int len; // 定義一個 int 類型的變量 len
while ((len = fis.read(buf)) != -1) { // 循環讀取數據
out.write(buf, 0, len);
}
socket.shutdownOutput(); //關閉客戶端輸出
流
InputStream in = socket.getInputStream(); // 獲取 Socket 的輸入
流對象
byte[] bufMsg = new byte[1024]; // 定義一個字節數
組
int num = in.read(bufMsg); //接收服務端的信
息
String Msg = new String(bufMsg, 0, num);
System.out.println(Msg);
fis.close(); // 關鍵輸入流
對象
socket.close(); // 關閉
Socket 對象
}
}
運行結果如圖 13-22 所示。
例 13-14 中,首先在代碼的第 5 行創建 Socket 對象,指定連接服務器的 IP 地址和端口 號,然后獲取 Socket 的輸出流對象。在代碼的第 7~13 行,創建 FilelnputStream 對象讀取 圖片 1.jpg,并通過 Socket 的輸出流對象向服務器端發送圖片。發送完畢后調用 Socket 的 shutDownOutput()方法關閉客戶端的輸出流。需要注意的是,shutDownOutput()方法非常重 要,因為服務器端程序在 while 循環中讀取客戶端發送的數據,當讀取到-1 時才會結束循環, 如果在客戶端不調用 shutDownOutput()方法關閉輸出流,服務器端就不會讀到-1,而會一直 執行 while 循環,同時客戶端讀取服務器端數據的 read(byte [])方法也是個阻塞方法,這樣 服務器端和客戶端程序進入了一個“死鎖”狀態,兩個程序都不能結束。 客戶端上傳圖片成功后,會讀取服務器端發送的“上傳完畢”信息,至此,客戶端程序的 編寫也完成了。為了證實圖片是否上傳成功,進入 D:\\upload 目錄下,在該目錄下可以看 見一張以 IP+count 編號命名的圖片,說明圖片上傳成功,如圖 13-23 所示。
訪客的評論 2023/11/08 20:53
文中描述的是準確的嗎,如何報名!