程序實現的是一個讀取照片(可改成其文件類型)的服務端,可同時接受多個客戶端鏈接,而且同時接受多張圖片的數據。主要是經過多線程控制,每次檢測到有請求鏈接,則開闢一個新線程,新線程的做用是接受圖片, 經過不一樣線程同時運行達到可同時接收多張圖片。java
1. 這是服務端的源代碼:服務器
import java.io.*; import java.net.*; public class LoadPicServer { public static void main(String[] args) throws IOException { int listen_port = 10005; //監聽的端口號 long filecount = 1; ServerSocket ss = new ServerSocket(listen_port); //監聽listen_port端口 if(ss.isBound()) System.out.println("The Server is listenning the port " + listen_port); while(true) { Socket s = ss.accept(); //檢查是否有鏈接,該語句是阻塞語句,若是沒有則會停在這。 if(s.isConnected()) { //若是有鏈接則返回true,執行下面語句 String filename = new String("ServerPic" + filecount++ + ".jpg"); System.out.println(s.getInetAddress().getHostAddress() + " is connected!"); //獲取已鏈接的客戶端的IP new Thread(new LoadPic(s,filename)).start(); //開啓新線程接收圖片,主線程繼續回去while最開始檢查有無鏈接。 } } } } /* * 該類實現Runnable接口,用於實現多線程複製圖片。 * 該類的做用就是與主線程傳入的Socket鏈接進行通訊,從網絡流獲取對方的傳送的文件數據。 * */ class LoadPic implements Runnable { Socket s = null; String filename = null; BufferedInputStream bufin = null; BufferedOutputStream bufout = null; PrintWriter return_txt = null; public LoadPic(Socket s,String filename) { this.s = s; this.filename = filename; } public void run() { try { bufin = new BufferedInputStream(s.getInputStream()); //獲取傳入Socket的輸入流,用於讀取圖片數據 bufout = new BufferedOutputStream(new FileOutputStream(filename)); //在當前文件夾建立名爲filename的文件,做爲輸出流的目的。 return_txt = new PrintWriter(new OutputStreamWriter(s.getOutputStream()),true); //該流用來向客戶端發送確認信息。 byte[] bufdata = new byte[1024]; int len; while((len = bufin.read(bufdata)) != -1) { //從輸入流讀取數據,不爲-1,即文件結束則繼續讀。 bufout.write(bufdata,0,len); //往文件裏寫數據 bufout.flush(); } return_txt.println("服務器接收成功!"); } catch (IOException e) { e.printStackTrace(); } finally { try { s.close(); bufin.close(); bufout.close(); return_txt.close(); } catch (IOException e) { e.printStackTrace(); } } } }
2. 這是客戶端源代碼,可同時開啓多個客戶端,作圖片並行傳輸測試。由於多個客戶端代碼基本同樣,因此只需看下面代碼便可:網絡
import java.net.*; import java.io.*; //該類是客戶端類,向服務器段發送請求鏈接,鏈接後就能夠發送圖片數據。 class UpPicClient { public static void main(String[] args) throws IOException,InterruptedException { Socket s = new Socket("192.168.1.7",10005); if(s.isBound()) { System.out.println("Connect successful!"); BufferedInputStream bufin = new BufferedInputStream(new FileInputStream("1.jpg")); BufferedOutputStream bufout = new BufferedOutputStream(s.getOutputStream()); BufferedInputStream confirm_txt = new BufferedInputStream(s.getInputStream()); byte[] bufdata = new byte[1024]; int len; while((len = bufin.read(bufdata)) != -1) { bufout.write(bufdata,0,len); bufout.flush(); } s.shutdownOutput(); System.out.println("發送結束!"); len = confirm_txt.read(bufdata,0,bufdata.length); String str = new String(bufdata,0,len); System.out.println(str); s.close(); bufin.close(); bufout.close(); confirm_txt.close(); } } }