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属性来指定一个关闭方法。

相关推荐
BullSmall6 分钟前
日志打印IP:安全与合规的最佳实践
网络·tcp/ip·安全
疯狂的程序猴9 分钟前
深入理解 iPhone 文件管理,从沙盒结构到开发调试的多工具协同实践
后端
一只游鱼17 分钟前
我的第一个微服务项目cy-fang1.0
java·后端·spring cloud
JavaGuide18 分钟前
对标MinIO!全新一代分布式文件系统诞生!
数据库·后端
缘来是庄20 分钟前
invalid comparison
java·spring boot·mybatis
喵个咪22 分钟前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:基于 Ent 从零实现新服务
后端·go·orm
atwednesday27 分钟前
分布式事务及实现方案
后端
文心快码BaiduComate29 分钟前
Comate Spec模式实测:让AI编程更精准可靠
前端·后端·前端框架
哈哈哈笑什么35 分钟前
3 次生产系统崩溃复盘:Java 后端从踩坑到封神的排查优化之路
java·后端·性能优化
ServBay36 分钟前
MongoDB 的文档模型与 CRUD 实战
数据库·后端·mongodb