springboot 中添加TCP连接服务端

创建一个单独的Spring Bean来管理TCP服务器的生命周期。这样做的好处是将TCP服务器的逻辑与Spring Boot应用的启动逻辑分离,使得代码更加模块化和可维护。

以下是一个示例,展示了如何在Spring Boot应用中创建一个单独的TCP服务器Bean:

创建一个Spring Bean来管理TCP服务器:

java 复制代码
package com.example.tcpserver;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
 
@Configuration
public class TcpServerConfig {
 
    @Bean
    public TcpServer tcpServer() {
        return new TcpServer();
    }
 
    public static class TcpServer implements Runnable {
        private final int port;
 
        public TcpServer() {
            this.port = 12345; // 你可以根据需要更改端口号
        }
 
        @Override
        public void run() {
            try (ServerSocket serverSocket = new ServerSocket(port)) {
                System.out.println("TCP服务器启动在端口 " + port);
 
                while (true) {
                    Socket clientSocket = serverSocket.accept();
                    System.out.println("客户端已连接");
 
                    // 在新的线程中处理客户端连接
                    new Thread(new ClientHandler(clientSocket)).start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
        static class ClientHandler implements Runnable {
            private final Socket clientSocket;
 
            public ClientHandler(Socket clientSocket) {
                this.clientSocket = clientSocket;
            }
 
            @Override
            public void run() {
                try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                     PrintWriter out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()), true)) {
 
                    String inputLine;
                    while ((inputLine = in.readLine()) != null) {
                        System.out.println("收到客户端消息: " + inputLine);
                        out.println("服务器: " + inputLine);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        clientSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

在Spring Boot应用启动时启动TCP服务器:

由于TcpServer实现了Runnable接口,你可以通过多种方式在Spring Boot应用启动时启动它。一个简单的方法是使用@EventListener监听ApplicationReadyEvent事件,该事件在Spring Boot应用完成所有自动配置并且准备好处理请求时触发。

java 复制代码
package com.example.tcpserver;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
 
@Component
public class TcpServerStarter implements ApplicationListener<ApplicationReadyEvent> {
 
    @Autowired
    private TcpServerConfig.TcpServer tcpServer;
 
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        new Thread(tcpServer).start();
    }
}

在这个例子中,TcpServerStarter类实现了ApplicationListener接口,并且监听了ApplicationReadyEvent。当事件触发时,它会在一个新的线程中启动TcpServer。

请注意,将TCP服务器放在一个新的线程中运行是很重要的,因为这样可以防止它阻塞Spring Boot应用的主线程,从而允许应用继续处理HTTP请求(如果有的话)。同时,确保在应用关闭时适当地关闭TCP服务器也是一个好习惯,这可以通过实现DisposableBean接口或使用@PreDestroy注解来完成。然而,在这个简单的例子中,我们没有包含这些逻辑。

在Spring Boot应用中,通过监听ApplicationReadyEvent事件,可以在Spring Boot完成所有自动配置并且准备好处理请求时(即应用已经启动并且处于就绪状态时),自动启动TCP服务器。

1.监听ApplicationReadyEvent事件:

Spring Boot提供了多种事件,允许开发者在应用生命周期的不同阶段进行干预。ApplicationReadyEvent是其中一个重要的事件,它在应用完成所有初始化工作并准备好接受HTTP请求时触发。

通过实现ApplicationListener接口并监听ApplicationReadyEvent,您可以在这个事件发生时执行特定的逻辑。

  1. 启动TCP服务器:

在监听器中,当ApplicationReadyEvent事件被触发时,您可以编写代码来启动TCP服务器。

通常,TCP服务器会在一个单独的线程中运行,以避免阻塞Spring Boot应用的主线程。

3.代码实现:

如前所述,您可以创建一个TcpServer类来实现TCP服务器的逻辑,并将其定义为一个Spring Bean。

然后,在监听ApplicationReadyEvent事件的类中,通过依赖注入获取TcpServer的实例,并在事件触发时启动它。

通过这种方式,您可以在Spring Boot应用启动时自动启动TCP服务器,而无需在Application类中直接编写启动逻辑。这有助于将TCP服务器的逻辑与Spring Boot应用的启动逻辑分离,使代码更加模块化和可维护。

请注意,确保TCP服务器在应用关闭时能够正确关闭是一个重要的考虑因素。您可以通过实现DisposableBean接口或使用@PreDestroy注解来添加关闭逻辑。此外,您还可以考虑使用Spring Boot的@Bean注解的destroyMethod属性来指定一个关闭方法。

相关推荐
IT_陈寒2 分钟前
Vite动态导入差点让我秃头,原来问题出在这
前端·人工智能·后端
唐青枫1 小时前
别只把大括号当作用域:Zig Block、标签块与控制流实战
后端
Zguigo1 小时前
lesson30-32计算机网络第四章:网络层核心三课(作用、IP协议、IPv4地址)
tcp/ip·计算机网络·php
TunerT_TQ3 小时前
Microsoft |Playwright CLI 源码静态审阅:从 5 个文件看浏览器自动化工具的工程边界
后端·开源·github
JavaGuide4 小时前
84.5K+ Star!这个开源编程 Agent 控制台,能统一管理 Codex、Claude Code,DeepSeek Harness 也能接入
后端·github
swipe4 小时前
RabbitMQ 实战:AI Agent 里异步处理的标配方案(手把手 + 4 种交换机全解析)
后端·面试·langchain
在世修行4 小时前
激光打标机TCP Socket通信协议:KZ指令集实战
tcp/ip·socket·自定义协议
神奇小汤圆4 小时前
30张图,搞懂分布式追踪系统
后端
量化小c5 小时前
一行代码查 BTCUSDT 和 AAPL 最新价?QuantDash 统一多市场实时行情接口实战
后端·算法·github