Spring Integration接收TCP与UDP请求

news2024/9/9 3:59:34

1:在项目中,需要接收其他服务的TCP与UDP请求,此时使用Netty可能会过度设计,想要一个轻量级nio的TCP、UDP服务端的话,我们可以选择 Spring Integration

2:pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>tcp-and-udp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>tcp-udp-message</name>
    <description>tcp与udp通讯</description>
    <properties>
        <java.version>21</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-ip</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin>
        </plugins>
    </build>

</project>

3:建立TCP服务端(注意:在发送tcp报文的时候,tcp报文需要以\r\n结尾,否则无法正常接收报文,如果需要发送、\r类的内容,需要加\,变成\r)

package com.demo.tcpAndUdp;

import lombok.extern.slf4j.Slf4j;
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 {

    private int PORT=8989;

    /**
     * 创建连接工厂
     * @return
     */
    @Bean
    public AbstractServerConnectionFactory serverConnectionFactory() {
        TcpNioServerConnectionFactory tcpNioServerConnectionFactory = new TcpNioServerConnectionFactory(PORT);
        tcpNioServerConnectionFactory.setUsingDirectBuffers(true);
        return tcpNioServerConnectionFactory;
    }

    /**
     * 创建消息通道
     * 这个bean可以注释,因为会使用默认的
     * @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消息
        String payload = new String(message);
        System.out.println("Received message: " + payload);
        log.info("处理TCP请求:"+message);
    }
}

4:建立UDP服务端(注意:发送中文可能会乱码)

package com.demo.study.mybatis.tcpAndUdp;

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.udp.UnicastReceivingChannelAdapter;

import java.nio.charset.StandardCharsets;

@Configuration
public class UdpServerConfig {

    private int udpPort = 9999;

    /**
     * 创建UDP接收通道
     */
    @Bean
    public DirectChannel udpReceiveChannel() {
        return new DirectChannel();
    }

    /**
     * 创建UDP单播接收通道适配器
     */
    @Bean
    public UnicastReceivingChannelAdapter unicastInboundAdapter() {
        UnicastReceivingChannelAdapter adapter = new UnicastReceivingChannelAdapter(udpPort);
        adapter.setOutputChannelName("udpReceiveChannel");
        return adapter;
    }

    /**
     * 处理UDP消息
     */
    @ServiceActivator(inputChannel = "udpReceiveChannel")
    public void messageReceiver(byte[] message) {
        String payload = new String(message, StandardCharsets.UTF_8);
        System.out.println("Received UDP message: " + payload);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1960783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言——设计TVM(地铁自动售票机)机软件。

输入站数&#xff0c;计算费用&#xff0c;计费规则&#xff0c;6站2元&#xff0c;7-10站3元&#xff0c;11站以上为4元。 输入钱数&#xff0c;计算找零(找零时优先找回面额大的钞票)&#xff0c;找零方式为各种面额张数&#xff0c;可识别面额&#xff1a; 100,50,20,10,5,1…

linux中mysql的安装使用(普通版版本+docker版本)

linux中mysql的安装使用 一、普通安装1.下载安装包2.流程 二、用docker安装1.拉取mysql镜像2.启动镜像3.开启权限第一种情况第二种情况 三、用Navicat连接 一、普通安装 1.下载安装包 挑选个你喜欢的目录&#xff0c;用wget下载并且解压 wget http://dev.mysql.com/get/Down…

指针!!C语言 字符串篇(第四篇)

目录 一. sizeof和strlen的对比 二. 数组和指针笔试题解析 2.1 一维数组 2.2 字符数组 2.3 二维数组 一. sizeof和strlen的对比 在C语言中有两个比较相似的知识点&#xff0c;就是sizeof和strlen&#xff0c;下面我们来讲一下它们两者之间有什么不同之处&#xff1f; &a…

python脚本制作循环执行命令行

python import subprocess import sysif __name____main__:ret 1while ret!0:ret subprocess.call(sys.argv[1:], textTrue)pack pip install pyinstaller pyinstaller --onefile loop.py pyinstaller -i *.ico loop.py #指定ico图标 使用场景 使用上面生成的loop.exe调用c…

前端开发者必备:揭秘谷歌F12调试的隐藏技巧!

前言 使用断点&#xff08;breakpoint&#xff09;是调试 JavaScript 代码的一种非常有效的方式。通过在代码的关键位置设置断点&#xff0c;可以阻止页面的状态变化&#xff0c;从而方便地检查和修改页面的当前状态。 1. 使用 setTimeout 配合 debugger 和 console.log setTi…

调用百度的大模型API接口实现AI对话!手把手教程!

本文介绍如何使用百度的大模型API接口实现一个AI对话项目 1 注册百度云 2 获取API接口 3 配置环境 4 代码编写与运行 5 chat models 1 注册百度云 搜索百度云&#xff0c;打开官网注册&#xff0c;充值一点点大米&#xff08;收费很低&#xff0c;大概生成几个句子花费一毛…

立仪光谱共焦传感器应用测量之:汽车连接器高度差测量

01 检测要求&#xff0c;要求测量汽车连接器的高度差 02 检测方式 根据观察&#xff0c;我们采用立仪科技光谱共焦H4UC控制器搭配D65A52系列镜头&#xff0c;角度最大&#xff0c;外径最大&#xff0c;量程大&#xff0c;可以有效应用于测量弧面&#xff0c;大角度面等零件。 0…

【嵌入式之RTOS】什么是著名的食客问题

目录 一、问题描述 二、四个条件 三、实际应用中的意义 著名的“食客问题”&#xff08;Dining Philosophers Problem&#xff09;是一个经典的计算机科学问题&#xff0c;用来说明并发编程中的资源竞争和死锁问题。这个问题最初是由荷兰计算机科学家Edsger Dijkstra提出的…

秘密实验室开服教程(SCP: Secret Laboratory)

1、购买后登录服务器&#xff08;百度莱卡云&#xff09; 购买服务器后&#xff0c;如下图&#x1f447;&#xff0c;面板信息都在产品详情页面内 注意&#xff1a;请不要用你的莱卡云账号信息去登陆服务器面板 进入控制面板后会出现正在安装的界面&#xff0c;安装时长约5分…

【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析

前言&#xff1a; 接上篇&#xff0c;排序算法除了选择排序&#xff08;希尔排序&#xff09;和插入排序&#xff08;堆排序&#xff09;之外&#xff0c;还用交换排序&#xff08;冒泡排序、快速排序&#xff09;和归并排序已经非比较排序&#xff0c;本篇来深层解析这些排序算…

2 卷积神经网络CNN

文章目录 LeNet-5AlexNetGoogLeNetResNet 本章代码均在kaggle上运行成功 LeNet-5 import torch import torch.nn as nn from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt from matplotlib_inline impo…

木马后门实验

实验拓扑 实验步骤 防火墙 配置防火墙—充当边界NAT路由器 边界防火墙实现内部 DHCP 分配和边界NAT需求&#xff0c;其配置如下 登录网页 编辑接口 配置e0/0 配置e0/1 编辑策略 测试&#xff1a;内部主机能获得IP&#xff0c;且能与外部kali通信 kali 接下来开启 kali 虚…

【视频讲解】后端增删改查接口有什么用?

B站视频地址 B站视频地址 前言 “后端增删改查接口有什么用”&#xff0c;其实这句话可以拆解为下面3个问题。 接口是什么意思&#xff1f;后端接口是什么意思&#xff1f;后端接口中的增删改查接口有什么用&#xff1f; 1、接口 概念&#xff1a;接口的概念在不同的领域中…

BUGKU-WEB-好像需要密码

如果点击start attrack 后出现 Payload set 1: Invalid number settings 的提示&#xff0c;先点hex 后点 decimal 再开始start attrack&#xff0c;这是一个软件bug&#xff0c;需要手动让它刷新。 解题思路 先随便输入测试&#xff1a;admin看看源码吧那就爆破了 据说&…

项目比赛经验分享:如何抓住“黄金一分钟”

项目比赛经验分享&#xff1a;如何抓住“黄金一分钟” 前言引起注意&#xff1a;用事实和故事开场明确痛点&#xff1a;描述问题和影响介绍解决方案&#xff1a;简明扼要激发兴趣&#xff1a;使用视觉辅助概述演讲结构&#xff1a;清晰的路线图我的开场白示例结语 前言 在创新的…

【小超嵌入式】 交叉编译工具安装过程

1、下载交叉编译工具链 ● 确定目标平台&#xff1a; 首先&#xff0c;你需要确定你的目标平台是什么&#xff0c;比如ARM、MIPS等。不同的目标平台需要不同的交叉编译工具链。 ● 获取工具链&#xff1a; 官方网站&#xff1a;通常可以从交叉编译器的官方网站下载适用于你的…

一番赏小程序开发,为消费者带来更多新鲜体验

一番赏作为经典的潮玩方式&#xff0c;深受消费者的喜爱&#xff0c;一番赏还会与不同的热门IP合作&#xff0c;不断推出新的赏品&#xff0c;吸引众多粉丝。赏品的内容非常丰富&#xff0c;从手办、公仔玩具等&#xff0c;还设有隐藏款和最终赏商品&#xff0c;对玩家拥有着非…

人工智能大模型发展的新形势及其省思

自2022年底OpenAI发布ChatGPT以来&#xff0c;大模型产业发展先后经历了百模大战、追求更大参数、刷榜竞分&#xff0c;直到近期各大厂商相继加入价格战&#xff0c;可谓热点纷呈。大模型的技术形态也从单纯文本发展到了多模态&#xff0c;从模拟人类大脑的认知功能发展到操控机…

暂存篇:高频面试题基本总结回顾(含笔试高频算法整理)

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

韦东山瑞士军刀项目自学之分析部分GPIO_HAL库函数代码

GPIO_HAL部分库函数分析 主要是分析了宏定义&#xff0c;这些宏定义可以被写入到对应的寄存器之中&#xff0c;从引脚到GPIO组再到模式速度等等&#xff0c;每一个参数都对应着寄存器的一位或几位。以后自己还是根据库函数来开发吧&#xff0c;太麻烦了。