Java 學習筆記 網絡編程 使用Socket傳輸文件 CS模式

Socket的簡單認識

Socket是一種面向鏈接的通訊協議,Socket應用程序是一種C/S(Client端/Server端)結構的應用程序 Socket是兩臺機器間通訊的端點。 Socket是鏈接運行在網絡上的兩個程序間的雙向通信端點。java

Socket通訊原理

  • Server服務端的輸入流至關於Client客戶端的輸出流
  • Server服務端的輸出流至關於Client客戶端的輸入流

注意

  • 文件傳輸使用字節流**(Steam)**
  • 使用DataOutputStream,DataOutputStream能夠傳java的基本類型和流

代碼

Server.java數組

package csmode2;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author StarsOne
 * @date Create in  2019-4-14 0014 10:53:58
 * @description
 */
class Server {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(9090)){

            System.out.println("服務器已啓動...");
            
            while (true) {
                System.out.println("等待接收文件");
                //調用了accept方法以後,會一直處於等待接受文件的狀態
                Socket socket = serverSocket.accept();//接收客戶端傳來的數據
                //交給後臺線程處理
                new AcceptThread(socket.getInputStream()).start();
            }


        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

AcceptThread.java服務器

package csmode2;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author StarsOne
 * @date Create in  2019/4/15 0015 14:17
 * @description
 */
class AcceptThread extends Thread {
    private InputStream inputStream;

    public AcceptThread(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    @Override
    public void run() {
        try {
            //使用DataInputStream包裝輸入流
            DataInputStream dataInputStream = new DataInputStream(inputStream);

            String fileName = dataInputStream.readUTF();
            System.out.println(fileName);//在控制檯顯示文件名

            //往某個位置寫入文件
            FileOutputStream fileOutputStream = new FileOutputStream("Q:\\MY" + File.separator + fileName);
            int c = -1;
            while ((c = dataInputStream.read()) != -1) {
                fileOutputStream.write(c);
                fileOutputStream.flush();
            }

            System.out.println("文件上傳成功!");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Client.java網絡

package csmode2;

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

/**
 * @author StarsOne
 * @date Create in  2019-4-14 0014 10:53:49
 * @description
 */
class Client {
    public static void main(String[] args) {
        //        File[] files = new File("E:\\wan\\testfile").listFiles();
        //若是是多個文件,只須要把文件放入一個list或者數組中,使用for循環把數組的文件所有上傳到服務器

        //上傳的文件
        File file = new File("R:\\動漫圖片\\test.jpg");

        try(Socket socket = new Socket("localhost", 9090)) {

            OutputStream outputStream = socket.getOutputStream();
            //使用DataOutputStream
            DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
            //向服務器端傳文件名
            dataOutputStream.writeUTF(file.getName());
            dataOutputStream.flush();//刷新流,傳輸到服務端

            //向服務器端傳文件,經過字節流
            //字節流先讀取硬盤文件
            BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
            
            int c = -1;
            while ((c=bufferedInputStream.read())!=-1) {
                //將讀取的文件以字節方式寫入DataOutputStream,以後傳輸到服務端
                //這裏也能夠使用byte[]數據進行讀取和寫入
                dataOutputStream.write(c);
                dataOutputStream.flush();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
相關文章
相關標籤/搜索