使用Spring Integration接收TCP与UDP请求
1. 简介
Spring Integration 是一个开源的项目,它是 Spring 生态系统的一部分,旨在简化企业集成(Enterprise Integration)的开发。它提供了一种构建消息驱动的、松散耦合的、可扩展的企业应用集成解决方案的方式。Spring Integration 基于 Spring Framework 构建,使开发者能够更容易地将不同的系统、应用程序和服务整合到一个协调的整体中。
Spring Integration 主要有以下作用
- 消息驱动的集成:Spring Integration 基于消息传递的模式,允许系统和应用程序通过消息进行通信。这种模式可以用于异步集成,以确保系统能够松散耦合,以及在高负载和大规模情况下具有良好的性能。
- 模块化和可扩展:Spring Integration 提供了一组模块,每个模块都用于处理特定类型的集成需求。这些模块可以按需组合和扩展,使开发者能够根据应用程序的需要选择合适的模块,并自定义它们。
- 集成各种传输协议和数据格式:Spring Integration 支持各种传输协议(例如,HTTP、JMS、FTP、SMTP等)和数据格式(例如,JSON、XML、CSV等),以便实现不同系统之间的数据传输和转换。
- 企业模式的集成:Spring Integration 提供了一些企业集成模式的实现,例如消息路由、消息转换、消息过滤、消息聚合等,以帮助解决不同场景下的集成挑战。
- 与 Spring 生态系统的集成:Spring Integration 与 Spring Framework 和 Spring Boot 紧密集成,开发者可以轻松整合已有的 Spring 应用程序,同时利用 Spring 的依赖注入和 AOP(面向切面编程)等功能。
2. 代码实战
本文主要介绍 Spring Integration 接收TCP与UDP请求的示例。在项目中,我们偶尔需要接收其他服务的TCP与UDP请求,此时使用Netty可能会过度设计,想要一个轻量级nio的TCP、UDP服务端的话,我们可以选择 Spring Integration。
环境:
- JDK21
- SpringBoot 3.1.4
- Spring Integration 6.1.3
2.1 导入依赖
<!-- 父工程,主要用作版本管控 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.4</version>
<relativePath />
</parent>
<!-- springboot-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring-integration -->
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-ip</artifactId>
</dependency>
注意:如果你的SpringBoot版本是2.x版本,那么你需要使用JDK21以下的版本,因为JDK中的包名有所更改。
2.2 建立TCP服务端
新建配置类TcpServerConfig,其中tcp.server.port需要到application.yml或者application.properties中进行配置。或者你也可以直接填写端口。
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.ip.tcp.TcpReceivingChannelAdapter;
import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory;
import org.springframework.integration.ip.tcp.connection.TcpNioServerConnectionFactory;
@Slf4j
@Configuration
public class TcpServerConfig {
@Value("${tcp.server.port}")
private int PORT;
/**
* 创建连接工厂
* @return
*/
@Bean
public AbstractServerConnectionFactory serverConnectionFactory() {
TcpNioServerConnectionFactory tcpNioServerConnectionFactory = new TcpNioServerConnectionFactory(PORT);
tcpNioServerConnectionFactory.setUsingDirectBuffers(true);
return tcpNioServerConnectionFactory;
}
/**
* 创建消息通道
* @return
*/
@Bean
public DirectChannel tcpReceiveChannel() {
return new DirectChannel();
}
/**
* 创建tcp接收通道适配器
* @return
*/
@Bean
public TcpReceivingChannelAdapter inboundAdapter() {
TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
adapter.setConnectionFactory(serverConnectionFactory());
adapter.setOutputChannelName("tcpReceiveChannel");
return adapter;
}
/**
* 处理请求器
* @param message
*/
@ServiceActivator(inputChannel = "tcpReceiveChannel")
public void messageReceiver(byte[] message) {
// 处理接收到的TCP消息
log.info("处理TCP请求");
}
}
注意:在发送tcp报文的时候,tcp报文需要以
\r\n结尾,否则无法正常接收报文。
2.3 建立UDP服务端
新建配置类UdpServerConfig,其中udp.server.port需要到application.yml或者application.properties中进行配置。或者你也可以直接填写端口。
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.ip.dsl.Udp;
import org.springframework.messaging.Message;
@Slf4j
@Configuration
public class UdpServerConfig {
@Value("${udp.server.port}")
private int PORT;
/**
* 创建UDP服务器接收通道适配器
* @return
*/
@Bean
public IntegrationFlow udpIn() {
return IntegrationFlow.from(Udp.inboundAdapter(PORT))
.channel("udpReceiveChannel")
.get();
}
/**
* 创建消息接收通道
* @return
*/
@Bean
public DirectChannel udpReceiveChannel() {
return new DirectChannel();
}
/**
* 处理接收到的UDP消息
* @param message
*/
@ServiceActivator(inputChannel = "udpReceiveChannel")
public void udpHandleMessage(Message<byte[]> message) {
// 处理接收到的UDP消息
byte[] payload = message.getPayload();
log.info("处理UDP请求");
}
}
3. 总结
对比Netty,Spring Integration比较轻量级,也更容易集成到 SpringBoot 中,但是性能肯定不如Netty。这里也只是给接收TCP、UDP请求设计方面多一个选择。
使用Spring Integration接收TCP与UDP请求的更多相关文章
- 网络七层模型及TCP、UDP,一次HTTP请求都发生了什么
一.七层网络模型 http协议运行在应用层 二.TCP-UDP TCP.UDP协议的区别 一次Http 请求,这个过程都发生了什么 TCP 协议如何保证可靠传输 HTTP和HTTPS的区别 TCP ...
- [转] Spring Integration 系统集成
[From] http://blog.csdn.net/w_x_z_/article/details/53316618 pring Ingegration 提供了基于Spring的EIP(Enterp ...
- Spring Boot 搭建TCP Server
本示例首选介绍Java原生API实现BIO通信,然后进阶实现NIO通信,最后利用Netty实现NIO通信及Netty主要模块组件介绍. Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可 ...
- [Java网络安全系列面试题] 说一说TCP和UDP的区别与联系?
TCP TCP是Transfer Control Protocol(传输控制协议)的简称,是一种面向连接的保证可靠传输的协议. 在TCP/IP协议中,IP层主要负责网络主机的定位,数据传输的路由,由I ...
- C++网络套接字编程TCP和UDP实例
原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1. 创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1) 创建套接字(so ...
- 初入网络系列笔记(2)TCP和UDP
一.借鉴说明,本博文借鉴以下博文 1.BlueTzar,TCP/IP四层模型, http://www.cnblogs.com/BlueTzar/articles/811160.html 2.叶剑峰,漫 ...
- 【Python网络编程】利用Python进行TCP、UDP套接字编程
之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...
- 基于socket的TCP和UDP编程
一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...
- (转)基于socket的TCP和UDP编程
一.概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流 ...
- TCP、UDP、RTP(RTCP)异同与区别
OSI七层模型OSI 中的层 功能 TCP/IP协议族 应 用层 ...
随机推荐
- range嵌套range beego前端页面渲染
range嵌套range beego前端页面渲染 问题 listA(name,age...) listB(hobby...) 有多个不同的list 对象,在前端中需要用range渲染,但是多个list ...
- linux_mint_21 vim配置:剪贴板支持和输入法自动切换
一.vim的剪贴板支持 有的vim版本不支持系统剪切板,也就是说在vim编辑器外面复制的内容,不能够粘贴到vim中;在vim中通过yy.d.c复制剪切的内容也不能粘贴在vim编辑器外面. 这实在是有点 ...
- TrustZone——(一)
本文内容主要来源于网络,综合了网上的多篇文章,也加入了一些自己的理解,重新组织了文章结构使其便于理解. 主要参考的文章包括: 一篇了解TrustZone TrustZone领域先行者 TrustZon ...
- 用windows脚本命令netsh快速启用、禁用网络
用windows脚本命令netsh快速启用.禁用网络 不知道你有没有这种需求:公司单位里的网络是内网,有时需要连接手机热点wifi网络,这时就需要先禁用内网网卡,启用无线网卡.连接内网的时候又需要先禁 ...
- 2023年icpc大学生程序设计竞赛-wmh
这次比赛名额比较少,程老师还是给了我们新生更多机会,非常感谢.第一次去这么远打比赛,也算是比较开心的,过去那天晚上就被队友拉着出去玩,玩的很嗨,打的很菜.vp去年题的时候是自信的,参加今年正式赛的时候 ...
- docker部署zabbix6.0及企业微信发送告警
1 前言 1.1 实验背景 因zabbix 6.0新增许多新特性,为熟悉界面特意在本地部署一套简易版(未启用HA功能).原本想要在烧制了centos7.9系统树莓派上部署,一查之下armv7果然冷门, ...
- 【技术积累】Vue中的核心概念【四】
Vue的生命周期 Vue中的生命周期是指组件从创建到销毁的整个过程中,会触发一系列的钩子函数 Vue2中的生命周期 Vue2中的生命周期钩子函数是在组件的不同阶段执行的特定函数.这些钩子函数允许开发者 ...
- CenOS 安装 mysql 临时密码 处理
数据库 版本 Server version: 8.0.26 MySQL Community Server - GPL:官网下载的包 wget https://cdn.mysql.com//Downlo ...
- Vue通过v-modal实现子组件通讯
1.在props设置属性value props: { value: { type: Object, default: {} } } 1.设置data数据,接收value,在mounted或create ...
- 基于AIidlux平台的自动驾驶环境感知与智能预警
自动驾驶汽车又称为无人驾驶车,是一种需要驾驶员辅助或者完全不需操控的车辆. 自动驾驶分级: 自动驾驶系统的组成部分: 环境感知系统: 自动驾驶系统架构: 自动驾驶数据集: Aidlux的作用: YOL ...