天天看點

TCP用戶端上傳任意檔案至服務端3.服務端引入庫4.服務端代碼總結

1.用戶端引入庫

代碼如下(示例):

package TCP_and_UDP;
import java.io.*;
import java.net.Socket;
           

2.用戶端代碼

代碼如下(示例):

public class Client {
    private static final int SIZE = 1024*1024;
    public static void main(String[] args) throws IOException {
        in();
    }

    public static void in() throws IOException {

        //建立緩沖區存儲從鍵盤錄入的資訊,主要是一整行一整行地讀
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        //擷取檔案路徑
        System.out.println("請輸入檔案所在的目錄以及檔案名稱,以Enter鍵結束(例如:G:\\IdeaProjects\\untitled\\一路向北.mp3)");
        String dir = bufr.readLine();
        //擷取檔案類型
        System.out.println("請輸入上傳的檔案類型,以Enter鍵結束(例如:.mp3)");
        String name = bufr.readLine();
        //擷取IP位址
        System.out.println("請輸入你要上傳的IP位址,以Enter鍵結束");
        String ip = bufr.readLine();

        //關閉資源
        bufr.close();

        //調用運作用戶端所在的方法,并将檔案路徑,檔案類型和IP位址作為參數傳入
        free(dir,ip,name);
    }

    public static void free(String dir,String ip,String name) throws IOException {

        //建立Socket對象,這是必須要做的,因為用戶端和服務端就是靠這個連接配接,10005為端口号
        //不建議使用1024以内的端口号
        Socket s = new Socket(ip,10005);

        //讀取用戶端要上傳的檔案
        FileInputStream bufi = new FileInputStream(dir);

        //将讀到的檔案資料發送給服務端
        PrintStream out = new PrintStream(s.getOutputStream(),true);

        //将檔案類型告訴伺服器,以便于生成對應類型的檔案
        PrintWriter out1 = new PrintWriter(s.getOutputStream(),true);
        out1.println(name);

        //建立數組存儲讀到的檔案的位元組資訊
        byte[] buf = new byte[SIZE];

        int len = 0;
        while((len = bufi.read(buf))!=-1)
        {
            //将讀到的資料傳給伺服器端
           out.write(buf,0,len);

        }


        //告知服務端資料發送完畢,讓服務端停止讀取,否則服務端将一直等待讀取
        s.shutdownOutput();

        //讀取服務端發回來的應答消息,這裡用緩沖區是不想建立一個數組了
        BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));

        //這裡沒有加while語句是因為已經知道應答消息隻有:上傳成功,是以不需要,但為了嚴謹,根據需求添加
        String str = bufr.readLine();
        //輸出從服務端擷取的應答消息
        System.out.println(str);

        //關流,關閉資源,PrintStream和PrintWriter會随着Socket的關閉而關閉
        s.close();
        bufi.close();
        bufr.close();


    }
           

3.服務端引入庫

package TCP_and_UDP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
           

4.服務端代碼

public class Server {
    private static final int SIZE = 1024*1024;
    public static void main(String[] args) throws IOException {

        free();

    }

    public static void free() throws IOException {

        //建立伺服器端ServerSocket對象,用戶端和伺服器端的端口必須一緻才能進行連接配接
        ServerSocket ss = new ServerSocket(10005);

        //擷取連接配接進來的用戶端Socket對象......這裡可能說得不對
        Socket s = ss.accept();
        //列印連接配接進來的用戶端的IP,并且列印是否連接配接成功
        System.out.println(s.getInetAddress().getHostAddress()+".......連接配接成功");

        //從流中讀取用戶端發來的資料
        InputStream  in = s.getInputStream();

        //這個是從流中擷取檔案的類型,因為是用字元流傳過來的是字元串,是以用字元流
        BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String name = bufr.readLine();

        //建立檔案
        FileOutputStream fos = new FileOutputStream("server"+name);

        byte[] buf = new byte[SIZE];

        int len = 0;

        while((len = in.read(buf))!=-1)
        {
            //将資料寫入檔案
            fos.write(buf,0,len);
            fos.flush();
        }

        //建立PrintWriter對象,告訴用戶端檔案上傳成功
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);
        out.println("上傳成功");

        //關閉資源
        s.close();
        ss.close();
        fos.close();

    }
           

總結

以上就是全部内容,本文僅僅粗略地實作了用戶端向服務端上傳檔案,

每次隻能上傳一個檔案,如果需要同時上傳多個檔案,就需要運用到多線程任務來實作,可能有些地方的解釋不對,以及有一些地方浪費了資源,也就是有更好的方式,還希望路過的大佬能夠指出,謝謝大佬!!!!