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

相关推荐
ppo_wu几秒前
解决:com.mongodb.MongoSocketOpenException: Exception opening socket
java·数据库·spring boot·mongodb
工业互联网专业3 分钟前
基于Spark的共享单车数据存储系统的设计与实现_springboot+vue
大数据·vue.js·spring boot·spark·毕业设计·源码·课程设计
武昌库里写JAVA16 分钟前
【MySQL】mysql --force 参数的使用
spring boot·spring·毕业设计·layui·课程设计
赴前尘44 分钟前
go 模拟TCP粘包和拆包,及解决方法
网络·tcp/ip·golang
vvw&1 小时前
如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程
linux·运维·服务器·后端·nginx·ubuntu·性能优化
m0_748244962 小时前
Rust 图形界面开发——使用 GTK 创建跨平台 GUI
开发语言·后端·rust
Pandaconda2 小时前
【Golang 面试题】每日 3 题(七)
开发语言·笔记·后端·面试·职场和发展·golang·go
vvw&3 小时前
如何在 Ubuntu 22.04 上优化 Apache 以应对高流量网站教程
linux·运维·服务器·前端·后端·ubuntu·apache
小丁爱养花4 小时前
网络原理(六): UDP 协议
网络·tcp/ip·udp
问道飞鱼8 小时前
【Springboot知识】Springboot基础-过滤器与拦截器开发
java·spring boot·后端·过滤器·拦截器