Java TCP 网络通信编程

1. Java C-S 模式实现文件的网络传输,从客户端上传文件到服务器端,服务器端接收文件并下载保存到本地,反馈消息给客户端

客户端

package upload;

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

/**
 * @author Spring-_-Bear
 * @version 2021-11-16 09:40
 */
public class Client {
    
    
    public static void main(String[] args) {
    
    
        Socket socket = null;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        BufferedReader bufferedReader = null;
        BufferedInputStream bufferedInputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;

        try {
    
    
            // 文件大小,以字节为单位
            int fileSize = 0;
            // 文件路径
            File filePath = new File("C:\\Users\\Admin\\Desktop\\fishing.jpg");

            // 从磁盘读取文件,并存入文件字节数组
            int readLen;
            byte[] buf = new byte[1024];
            byteArrayOutputStream = new ByteArrayOutputStream();
            bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath));
            System.out.println("文件读入中···");
            while ((readLen = bufferedInputStream.read(buf)) != -1) {
    
    
                // 将从文件读取到的二进制数据写进字节数组输出流(byteArrayOutputStream)
                byteArrayOutputStream.write(buf, 0, readLen);
                fileSize += readLen;
            }
            System.out.println("文件读入成功,文件大小为:" + fileSize + " bytes!");
            // 将得到的 byteArrayOutputStream 转换为一个字符数组
            byte[] fileByteArray = byteArrayOutputStream.toByteArray();

            // 将字节数组写入数据通道
            socket = new Socket(InetAddress.getLocalHost(), 6666);
            outputStream = socket.getOutputStream();
            System.out.println("文件发送到服务器中···");
            outputStream.write(fileByteArray);
            socket.shutdownOutput();
            System.out.println("文件发送到服务器成功!");

            // 接送服务器端发送的反馈信息并打印
            System.out.print("接收到的服务器信息:");
            inputStream = socket.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            System.out.println(bufferedReader.readLine());
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            try {
    
    
                bufferedReader.close();
                inputStream.close();
                outputStream.close();
                byteArrayOutputStream.close();
                bufferedInputStream.close();
                socket.close();
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

服务端

package upload;

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

/**
 * @author Spring-_-Bear
 * @version 2021-11-16 09:40
 */
public class Server {
    
    
    public static void main(String[] args) {
    
    
        Socket socket = null;
        InputStream inputStream = null;
        ServerSocket serverSocket = null;
        OutputStream outputStream = null;
        BufferedWriter bufferedWriter = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        BufferedOutputStream bufferedOutputStream = null;

        try {
    
    
            // 监听端口,等待连接
            serverSocket = new ServerSocket(6666);
            System.out.println("服务器已启动,等待连接···");
            socket = serverSocket.accept();

            // 文件大小,单位为字节
            long fileSize = 0;
            // 文件保存路径
            File fileSavePath = new File("C:\\Users\\Admin\\Desktop\\temp.jpg");

            // 从数组通道读取文件字节数组
            int readLen;
            byte[] buffer = new byte[1024];
            inputStream = socket.getInputStream();
            byteArrayOutputStream = new ByteArrayOutputStream();
            System.out.println("文件读取中···");
            while ((readLen = inputStream.read(buffer)) != -1) {
    
    
                byteArrayOutputStream.write(buffer, 0, readLen);
                fileSize += readLen;
            }
            System.out.println("文件读取成功,总大小为 " + fileSize + " bytes!");
            // 将 byteArrayOutputStream 中的数据转换为字节数组(文件二进制数据)
            byte[] fileByteArray = byteArrayOutputStream.toByteArray();


            // 将文件字节数组保存到磁盘
            System.out.println("文件保存到本地中···");
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(fileSavePath));
            bufferedOutputStream.write(fileByteArray);
            System.out.println("文件保存到本地成功!保存路径为:" + fileSavePath);

            // 向客户端反馈文件下载保存成功信息
            outputStream = socket.getOutputStream();
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            System.out.print("发送反馈信息到客户端··· ");
            bufferedWriter.write("文件接收成功,下载保存完成!");
            bufferedWriter.newLine();
            bufferedWriter.flush();
            System.out.println("消息发送成功!");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            try {
    
    
                bufferedWriter.close();
                outputStream.close();
                bufferedOutputStream.close();
                byteArrayOutputStream.close();
                inputStream.close();
                socket.close();
                serverSocket.close();
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

2. 客户端发出下载文件请求,服务端响应客户端请求并将文件发送给客户端,客户端接收服务端发送的文件并下载保存到本地

客户端

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * 服务端:发送想要下载的文件名称到客户端,得到客户端回应并将文件保存到本地
 *
 * @author Spring-_-Bear
 * @version 2021-11-02 09:58
 */
public class FileClient {
    
    
    byte[] fileData = null;

    Socket socket = null;
    InputStream inputStream = null;
    OutputStream outputStream = null;
    BufferedOutputStream bufferedOutputStream = null;
    Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
    
    
        FileClient client = new FileClient();

        try {
    
    
            client.socket = new Socket(InetAddress.getLocalHost(), 9999);
            client.sendFileNameToServer();
            client.receiveFileData();
            client.saveFile();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            try {
    
    
                client.socket.close();
                client.inputStream.close();
                client.outputStream.close();
                client.bufferedOutputStream.close();
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }

    /**
     * 发送想要下载的文件名到服务器端
     */
    public void sendFileNameToServer() {
    
    
        try {
    
    
            System.out.print("请输入您想要下载的文件名(含文件拓展名):");
            String choice = scanner.next();
            outputStream = socket.getOutputStream();
            outputStream.write(choice.getBytes(StandardCharsets.UTF_8));
            socket.shutdownOutput();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 接收从服务端传送的数据
     */
    public void receiveFileData() {
    
    
        try {
    
    
            int readLen = 0;
            byte[] buf = new byte[1024];
            inputStream = socket.getInputStream();
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            System.out.println("正在接收服务器传输的文件···");
            while ((readLen = inputStream.read(buf)) != -1) {
    
    
                byteArrayOutputStream.write(buf, 0, readLen);
            }
            socket.shutdownInput();
            fileData = byteArrayOutputStream.toByteArray();
            System.out.println("文件接收成功!");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 将从服务器端接收到的文件保存到本地
     */
    public void saveFile() {
    
    
        try {
    
    
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Admin\\Desktop\\temp.jpg"));
            System.out.println("正在将文件保存到本地···");
            bufferedOutputStream.write(fileData);
            System.out.println("文件保存到本地完成!");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

//    /**
//     * 读取服务端发送的文件名并显示到控制台
//     */
//    public void receiveFilesName() {
    
    
//        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
//        System.out.println("正在接收服务端发送的文件目录···");
//        String fileName = "";
//        System.out.println(bufferedReader.readLine());
//        while ((fileName = bufferedReader.readLine()) != null) {
    
    
//            System.out.println(fileName);
//        }
//        System.out.println("接收服务端发送的文件目录成功!");
//    }
}

服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

/**
 * 服务端:将客户端请求的文件传输到客户端
 *
 * @author Spring-_-Bear
 * @version 2021-11-02 09:57
 */
public class FileServer {
    
    
    byte[] fileData = null;
    String requestFileName = null;
    ArrayList<String> fileNameList = new ArrayList<>();
    File filePath = new File("C:\\Users\\Admin\\Desktop\\sourceFile");

    Socket socket = null;
    ServerSocket serverSocket = null;
    InputStream inputStream = null;
    BufferedInputStream bufferedInputStream = null;

    public static void main(String[] args) {
    
    
        FileServer server = new FileServer();
        server.createAndReadFiles();
        server.startServer();
        server.receiveRequestNameFromClient();
        server.readFileFromDisk();
        server.transferFileToClient();
        try {
    
    
            server.socket.close();
            server.serverSocket.close();
            server.inputStream.close();
            server.bufferedInputStream.close();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 读取指定路径下的所有文件
     */
    public void createAndReadFiles() {
    
    
        System.out.println("正在进行文件夹初始化···");
        // 若文件夹不存在,则先创建文件夹
        if (!(filePath.exists() && filePath.isDirectory())) {
    
    
            filePath.mkdirs();
        }

        // 读取文件夹中的所有文件,并将文件名存进集合
        File[] files = filePath.listFiles();
        for (File file : files) {
    
    
            if (file.isFile()) {
    
    
                fileNameList.add(file.getName());
            }
        }
        System.out.println("初始化完成!");
    }

    /**
     * 启动服务器
     */
    public void startServer() {
    
    
        try {
    
    
            serverSocket = new ServerSocket(9999);
            System.out.println("服务器已启动,等待连接···");
            socket = serverSocket.accept();
            System.out.println("服务端 - 客户端建立连接成功!");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 读取客户端请求的文件名
     */
    public void receiveRequestNameFromClient() {
    
    
        try {
    
    
            int readLen;
            byte[] buf = new byte[2048];
            inputStream = socket.getInputStream();
            System.out.println("正在接收客户端请求的文件名···");
            while ((readLen = inputStream.read(buf)) != -1) {
    
    
                requestFileName = new String(buf, 0, readLen);
            }
            socket.shutdownInput();
            System.out.println("成功接收到客户端请求的文件名!");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 从磁盘中读取文件内容到内存
     */
    public void readFileFromDisk() {
    
    
        try {
    
    
            int readLen = 0;
            byte[] buf = new byte[1024];
            File requestFile = new File(filePath + "\\" + requestFileName);
            bufferedInputStream = new BufferedInputStream(new FileInputStream(requestFile));
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            System.out.println("正在从磁盘读取文件···");
            while ((readLen = bufferedInputStream.read(buf)) != -1) {
    
    
                byteArrayOutputStream.write(buf, 0, readLen);
            }
            fileData = byteArrayOutputStream.toByteArray();
            System.out.println("从磁盘读取文件完成!");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 将文件字节数组传输到客户端
     */
    public void transferFileToClient() {
    
    
        try {
    
    
            System.out.println("正在传送文件到客户端···");
            OutputStream outputStream1 = socket.getOutputStream();
            outputStream1.write(fileData);
            System.out.println("文件传输到客户端完成!");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

//    /**
//     * 发送文件中的文件夹中的所有文件名到客户端
//     */
//    public void sendFilesNameToClient() {
    
    
//        System.out.println("正在发送文件目录到客户端···");
//        outputStream = socket.getOutputStream();
//        bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
//        for (String fileName : fileArrayList) {
    
    
//            bufferedWriter.write((fileName));
//            outputStream.flush();
//        }
//        bufferedWriter.newLine();
//        outputStream.flush();
//        System.out.println("文件目录发送到客户端成功!");
//    }
}

猜你喜欢

转载自blog.csdn.net/weixin_51008866/article/details/121089446