Java教程

Java TCP 网络通信编程

本文主要是介绍Java TCP 网络通信编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

  • 客户端:
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

/**
 * 客户端:将文件发送到服务器端,并接收服务器发送的反馈信息
 *
 * @author Spring-_-Bear
 * @version 2021-11-01 20:24
 */
public class FileSendClient {
    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 readLen;
            // 文件大小
            int fileSize = 0;
            // 字节缓冲数组,加快文件读取速度
            byte[] buffer = new byte[1024];
            // 文件路径
            File filePath = new File("C:\\Users\\Admin\\Desktop\\BeFree.jpg");
            // 创建字节输出流,保存从文件读取到的二进制数据
            byteArrayOutputStream = new ByteArrayOutputStream();
            // 文件输入流
            bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath));

            // 读取图片文件中的二进制内容,并将内容写进字节数组输出流
            System.out.println("文件读入中···");
            while ((readLen = bufferedInputStream.read(buffer)) != -1) {
                // 将从文件读取到的二进制数据写进字节数组输出流(byteArrayOutputStream)
                byteArrayOutputStream.write(buffer, 0, readLen);
                fileSize += readLen;
            }
            System.out.println("文件读入成功,文件大小为:" + fileSize + " bytes!");

            // 将得到的 byteArrayOutputStream 转换为一个字符数组
            byte[] array = byteArrayOutputStream.toByteArray();
            // 与服务器端建立连接
            socket = new Socket(InetAddress.getLocalHost(), 6666);
            // 获取输出流,将图片字节数组发送到服务器端
            outputStream = socket.getOutputStream();
            System.out.println("文件发送到服务器中···");
            outputStream.write(array);
            // 写入结束标志
            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 {
                socket.close();
                inputStream.close();
                outputStream.close();
                bufferedReader.close();
                bufferedInputStream.close();
                byteArrayOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 服务器端:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务器端:接收客户端发送的文件并下载保存到本地
 *
 * @author Spring-_-Bear
 * @version 2021-11-01 20:23
 */
public class FileReceiveServer {
    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();

            // 读取到的字节数
            int readLen;
            // 文件大小,单位为字节
            long fileSize = 0;
            // 缓冲字节数组,加快读取数组
            byte[] buffer = new byte[1024];
            // 获得输出流,从输入流中读取客户端发送过来的二进制数组信息
            inputStream = socket.getInputStream();
            // 字节数组输出流,保存从 inputStream 依次读出到的二进制数据
            byteArrayOutputStream = new ByteArrayOutputStream();

            // 从 inputStream 中读取数据
            System.out.println("文件读取中···");
            // 读取 inputStream 中的数据,并将数据写进 byteArrayOutputStream
            while ((readLen = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, readLen);
                fileSize += readLen;
            }
            System.out.println("文件读取成功,总大小为 " + fileSize + " bytes!");

            // 将 byteArrayOutputStream 中的数据转换为字节数组(文件二进制数据)
            byte[] array = byteArrayOutputStream.toByteArray();
            // 将最终得到的字节数组写进文件
            File filePath = new File("C:\\Users\\Admin\\Desktop\\temp.jpg");
            System.out.println("文件保存到本地中···");
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(filePath));
            bufferedOutputStream.write(array);
            System.out.println("文件保存到本地成功!保存路径为:" + filePath);

            // 向客户端反馈文件下载保存成功信息
            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 {
                socket.close();
                inputStream.close();
                outputStream.close();
                serverSocket.close();
                bufferedWriter.close();
                byteArrayOutputStream.close();
                bufferedOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
这篇关于Java TCP 网络通信编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!