Spring Boot 实现 Socket 连接

在现代应用程序中,Socket 通信是一种常见的方式,它允许不同的计算机通过网络进行数据交换。在 Spring Boot 中实现 Socket 是一项重要的技能,不论是在构建实时聊天应用,还是在处理后端服务之间的通信时,这一功能都是必不可少的。本文将通过代码示例向您展示如何在 Spring Boot 中实现基础的 Socket 连接。

Socket 简介

Socket 是网络中的一个基础组件,它为不同主机之间的通信提供了端点。每个 Socket 都有一个 IP 地址和一个端口号。通信过程分为客户端和服务端,客户端请求连接,服务器端接受连接并进行数据交互。

环境准备

在开始之前,请确保您已在本地环境中安装了 JDK 和 Maven,并创建一个 Spring Boot 项目。

代码示例

接下来,我们将创建一个简单的 Socket 服务器和客户端应用程序。我们会使用 ServerSocket 类来创建服务器端,以及 Socket 类来创建客户端。

服务器端代码

首先是服务器端代码,我们需要创建一个 REST 控制器以及一个 SocketServer 类。

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

@SpringBootApplication
public class SocketServerApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(SocketServerApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(12345);
        System.out.println("Server is listening on port 12345");

        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("New client connected");

            // Handle the client in a new thread
            new ClientHandler(socket).start();
        }
    }

    private static class ClientHandler extends Thread {
        private final Socket socket;

        public ClientHandler(Socket socket) {
            this.socket = socket;
        }

        public void run() {
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

                String message;
                while ((message = in.readLine()) != null) {
                    System.out.println("Received: " + message);
                    out.println("Echo: " + message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

客户端代码

接下来是客户端代码,它将连接到服务器并发送消息。

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

public class SocketClient {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 12345);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            // Sending a message to Server
            out.println("Hello Server!");

            // Receiving a response from Server
            String response = in.readLine();
            System.out.println("Server response: " + response);
            
            // Cleanup
            in.close();
            out.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

类图

以下是我们在上述代码中使用的类的结构:

classDiagram
    class SocketServerApplication {
        +main(String[] args)
        +run(String... args)
    }
    class ClientHandler {
        -Socket socket
        +ClientHandler(Socket socket)
        +run()
    }

运行程序

  1. 先运行 SocketServerApplication 类,您的服务器将在标准输入上等待连接。
  2. 然后运行 SocketClient,观察消息的发送和接收。

结论

通过以上示例,您可以看到如何在 Spring Boot 中实现基本的 Socket 通信。Socket 连接为实时通信提供了一种高效且灵活的方法。这一基础元素为您后续开发复杂应用程序奠定了良好的基础。希望这篇文章能帮助您更好地理解 Socket 在 Spring Boot 中的实现与应用。未来,您可以结合更复杂的业务逻辑和数据处理,进一步拓展这一主题。