天天看點

Java 基于TCP的socket實作檔案傳輸Java 基于TCP的socket實作檔案傳輸

Java 基于TCP的socket實作檔案傳輸

  • 基于TCP的socket結合java的io流 實作用戶端與伺服器之間的檔案傳輸

Socket

套接字(socket)是一個抽象層,應用程式可以通過它發送或接收資料,可對其進行像對檔案一樣的打開、讀寫和關閉等操作。套接字允許應用程式将I/O插入到網絡中,并與網絡中的其他應用程式進行通信。網絡套接字是IP位址與端口的組合

設計思路

1、建立連接配接

兩個接口一個模仿伺服器,一個模仿用戶端 伺服器建立服務端口,

用戶端根據端口号和ip建立兩者間的連接配接

2、發送檔案

用戶端将檔案以輸入流的方式傳給伺服器

伺服器利用socket.getInputStream()方法擷取到用戶端傳進來的輸入流,并将其接收存放

3、接收回報資訊

伺服器接收成功後利用輸出流向用戶端發出回報

用戶端接收導伺服器的輸出資訊并列印下來

代碼實作

實作流程

伺服器

1、啟動伺服器

   伺服器建立端口

    伺服器監聽端口,等待通路資料。。。。。

3、伺服器接收用戶端發送過來的檔案

   伺服器将回報消息發往用戶端

用戶端

2、啟動用戶端

   用戶端與伺服器建立連接配接

    用戶端将檔案以流的格式發送到伺服器上

     用戶端等待伺服器回報。。。。。

4、用戶端接收伺服器發送過來的回報消息

1、用戶端

public static void main(String[] args) throws IOException {
            //建立與伺服器的連接配接
            Socket client = new Socket("192.168.3.76", 1617);
            //建立用戶端輸出流
            OutputStream out = client.getOutputStream();
            //建立用戶端輸入流,将檔案發送伺服器
            FileInputStream in =
            new FileInputStream(new File("D:列印020.txt"));
            byte[] buff = new byte[1024];
            int len;
            //io流讀寫資料
            while ((len = in.read(buff)) != -1) {
                out.write(buff, 0, len);
            }
            //将接收的資料發送出去 并 拒絕接收輸出流的資料
            client.shutdownOutput();

            //接收來自于伺服器端的回報,并顯示在控制台
            InputStream sin = client.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(sin));
            String line = null;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            //關閉資源
            out.close();
            in.close();
            client.close();
            sin.close();
            reader.close();
        }

           

2、伺服器

public static void main(String[] args) {
    try (
//      伺服器接收用戶端的資料并傳回消息
        ServerSocket server = new ServerSocket(1617);
        //監聽要建立到此套接字的連接配接并接受
        Socket socket = server.accept();
        //建立輸入流接收用戶端發送過來的資料
        InputStream in = socket.getInputStream();
        //建立輸出流存放讀取的資料
        OutputStream out = new FileOutputStream(new File("D:列印0211.txt"))
    ) {
            byte[] buff = new byte[1024];
            int len;
            //io流讀寫資料
            while ((len = in.read(buff)) != -1) {
                out.write(buff, 0, len);
            }

            // 接收到圖檔後向用戶端回報
            try (BufferedWriter writer = new BufferedWriter(
            new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8))
            {
                writer.write("你好,我已成功收到圖檔!");
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }