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

相关推荐
bobz9653 分钟前
网段分配
后端
bobz9657 分钟前
VRRP 负载均衡:一个网段多个网关(网关数量和交换机数目一致:一般是两个)
后端
bobz96511 分钟前
VRRP 简记
后端
冯仙笙18 分钟前
统一支付入口集成六种支付方式
后端
无双_Joney30 分钟前
[更新迭代 - 1] Nestjs 在24年底更新了啥?(功能篇)
前端·后端·nestjs
泉城老铁38 分钟前
idea 优化卡顿
前端·后端·敏捷开发
福大大架构师每日一题43 分钟前
RustDesk 1.4.2 版本发布:新增增量文件传输与光标显示功能
后端
LH_R1 小时前
OneTerm开源堡垒机实战(四):访问授权与安全管控
运维·后端·安全
poemyang1 小时前
技术圈的“绯闻女孩”:Gossip是如何把八卦秘密传遍全网的?
后端·面试·架构
BingoGo1 小时前
PHP 如何利用 Opcache 来实现保护源码
后端·php