springboot 中添加TCP连接服务端

devtools/2024/12/27 3:53:03/

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

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

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 {@Beanpublic TcpServer tcpServer() {return new TcpServer();}public static class TcpServer implements Runnable {private final int port;public TcpServer() {this.port = 12345; // 你可以根据需要更改端口号}@Overridepublic 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;}@Overridepublic 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应用完成所有自动配置并且准备好处理请求时触发。

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> {@Autowiredprivate TcpServerConfig.TcpServer tcpServer;@Overridepublic 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,您可以在这个事件发生时执行特定的逻辑。
2. 启动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属性来指定一个关闭方法。


http://www.ppmy.cn/devtools/145706.html

相关文章

武汉火影数字3D光影秀打造 “光+影+文化+故事+演艺“完美融合

3D光影秀打造利用虚拟现实技术、裸眼3D动画技术&#xff0c;创造出一种立体视觉效果&#xff0c;实现物体与动画的完美融合&#xff0c;产生强烈的视觉冲击力。 作为一种独特的艺术形式&#xff0c;光影秀能够打破传统艺术形式的界限&#xff0c;提供全新的视觉体验&#xff0c…

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

本篇文章将介绍一个新的改进机制——SMFA&#xff08;自调制特征聚合模块&#xff09;&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。随着深度学习在计算机视觉中的不断进展&#xff0c;目标检测任务也在快速发展。YOLO系列模型&#xff08;You Onl…

QtCreator配置github copilot实现AI辅助编程

文章目录 1、概述2、配置环境3、演示 1、概述 新时代的浪潮早就已经来临&#xff0c;上不了船的人终将被抛弃&#xff0c;合理使用AI辅助开发、提升效率是大趋势&#xff0c;注意也不要过于依赖。 2024年12月18日&#xff0c;GitHub 官方宣布了一个激动人心的重大消息&#xf…

HarmonyOS NEXT 实战之元服务:静态案例效果---手机查看电量

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

Java重要面试名词整理(三):并发编程(上)

文章目录 并发编程基础概念线程&进程进程线程进程&线程区别总结进程间的通信[面试热点]CPU核心数和线程数的关系 上下文切换&#xff08;Context switch&#xff09;**并行和并发** Java里的线程启动**Thread** **和** **Runnable** **的区别****Callable** **、Future…

PHP 微信棋牌开发全解析:高级教程

PHP - 多维数组详解 多维数组是 PHP 中一种强大的数据结构&#xff0c;指的是一个数组的元素中可以包含一个或多个数组。它常用于存储复杂的嵌套数据&#xff0c;如表格数据或多层次关系的数据结构。 注释&#xff1a; 数组的维度表示您需要指定索引的层级数&#xff0c;以访问…

CICD篇之通过Jenkins中书写pipeline构建编译打包发布流程

1. Jenkins中Pipeline作用 在 Jenkins 中使用 Pipeline 来构建、打包、编译和发布代码的流水线&#xff0c;可以帮助团队实现自动化的持续集成与持续交付&#xff08;CI/CD&#xff09;。 我们可以通过 Jenkins Pipeline 管道&#xff0c;自动化执行从代码检出、构建、测试到发…

C# Winform打开和预览PDF,方法一:调用CefSharp包,内嵌浏览器

开发上位机过程中遇到软件要内嵌说明书的需求&#xff0c;需要用按钮调出带有文字和图片的操作手册。思虑再三后觉得用一个窗口显示操作手册pdf文件的方式&#xff0c;于是找到了一个CefSharp的nuget包能够用来显示pdf。 一、预览效果 二、实现步骤 1、右击需要加pdf预览功能…