一、功能介紹
該功能主要實現,將客戶端的:F:/work/socketSample/filetemp/client/test_client.txt上傳到服務端F:/work/socketSample/filetemp/server/test_server.txt,並將test_client.txt名字修改為test_server.txt,如果服務端收到文件,則向客戶端發送提示信息”文件已保存至服務器的F:/work/socketSample/filetemp/server/test_server.txt“
二、工程目錄結構

三、服務端
1)Server,服務端主類,監聽端口,有請求將開啟處理子線程
package fileSockeServer; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * 基於TCP協議的Socket通信,實現文件傳輸-服務器端 */ public class Server { public static void main(String[] args) { try { // 創建一個服務器端的ServerSocket,綁定並監聽9999端口 ServerSocket serverSocket = new ServerSocket(9999); int count = 0;// 記錄客戶端的數量 System.out.println("服務器啟動,等待客戶端的連接。。。"); Socket socket = null; while (true) { // 循環監聽等待客戶端的連接 socket = serverSocket.accept(); // 每當一個客戶端連接到服務器,服務器啟動一個單獨的線程處理與此客戶端的通信 ++count; Thread serverHandleThread = new Thread(new ServerHandleThread(socket)); serverHandleThread.setPriority(4);// 設置線程的優先級[1,10],1為最低,默認是5 serverHandleThread.start(); System.out.println("上線的客戶端有" + count + "個!"); InetAddress inetAddress = socket.getInetAddress(); System.out.println("當前客戶端的IP地址是:"+ inetAddress.getHostAddress()); } } catch (IOException e) { e.printStackTrace(); } } }
2)ServerHandleThread,對客戶端的請求進行處理的子線程類
package fileSockeServer; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; public class ServerHandleThread implements Runnable{ Socket socket = null;// 和本線程相關的Socket public ServerHandleThread(Socket socket) { super(); this.socket = socket; } // 響應客戶端的請求 @Override public void run() { // TODO Auto-generated method stub OutputStream os = null; PrintWriter pw = null; try { InputStream is=socket.getInputStream(); // 要完成客戶端文件上傳到服務器的功能需要將客戶機的文件通過FileInputStream進行讀取,並包裝成BufferedInputStream, //將套接字的輸出流包裝成BufferedOutputStream,用BufferedInputStream中的read()方法讀取文件中的數據, //並用 BufferedOutputStream中的write()方法進行寫入,這樣文件就送入了Socket的輸出流; BufferedInputStream bufferedInputStream = new BufferedInputStream(is);// 將BufferedInputStream與套接字的輸入流進行連接 BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(new FileOutputStream("F:/work/socketSample/filetemp/server/test_server.txt")); byte[] buf=new byte[1024]; int len=0; while((len=bufferedInputStream.read(buf))!=-1){ bufferedOutputStream.write(buf, 0, len); } //強行寫入輸出流,因為有些帶緩沖區的輸出流要緩沖區滿的時候才輸出 bufferedOutputStream.flush();// 刷新緩沖流 socket.shutdownInput();// 關閉輸入流 os=socket.getOutputStream(); pw=new PrintWriter(os); pw.println("文件已保存至服務器的F:/work/socketSample/filetemp/server/test_server.txt"); pw.flush(); socket.shutdownOutput(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ // 關閉相關資源 try { if (pw != null) { pw.close(); } if (os != null) { os.close(); } if (socket != null) { socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
四、客戶端
1)Client,向服務端發送文件,如果收到服務的反饋信息,將信息打印輸出
package fileSocketClient; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; /** * 基於TCP協議的Socket通信,實現文件傳輸-客戶端 */ public class Client { public static void main(String[] args) { try { // 1.創建客戶端的Socket,指定服務器的IP和端口 Socket socket = new Socket("127.0.0.1", 9999); // 2.獲取該Socket的輸出流,用來向服務器發送文件 OutputStream os = socket.getOutputStream(); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(os);// 將BufferedOutputStream與套接字的輸出流進行連接 BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("F:/work/socketSample/filetemp/client/test_client.txt"));// 讀取客戶機文件 byte[] buf = new byte[1024]; int len = 0; while ((len = bufferedInputStream.read(buf)) != -1) { bufferedOutputStream.write(buf, 0, len);// 向BufferedOutputStream中寫入數據 } bufferedOutputStream.flush();// 刷新緩沖流 socket.shutdownOutput();// 禁用此套接字的輸出流 // 3.獲取輸入流,取得服務器的信息 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String info = null; while ((info = br.readLine()) != null) { System.out.println("服務器端的信息:" + info); } socket.shutdownInput();// 禁用此套接字的輸出流 // 4.關閉資源 os.close(); bufferedInputStream.close(); bufferedOutputStream.close(); is.close(); br.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
