【TCP協議練習】服務端利用多線程TCP同時接受多個客戶端發送文件

   程序實現的是一個讀取照片(可改成其文件類型)的服務端,可同時接受多個客戶端鏈接,而且同時接受多張圖片的數據。主要是經過多線程控制,每次檢測到有請求鏈接,則開闢一個新線程,新線程的做用是接受圖片, 經過不一樣線程同時運行達到可同時接收多張圖片。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();
        }
    }
}
相關文章
相關標籤/搜索