C# DotNetty客户端
1. 引入DotNetty包
我用的开发工具是VS2022,不同工具引入可能会有差异
工具——>NuGet包管理器——>管理解决方案的NuGet程序包

搜索DotNetty

2.新建EchoClientHandler.cs类
用于接收服务器返回数据
public class EchoClientHandler : SimpleChannelInboundHandler<IByteBuffer>
{/// <summary>/// Read0是DotNetty特有的对于Read方法的封装/// 封装实现了:/// 1. 返回的message的泛型实现/// 2. 丢弃非该指定泛型的信息/// </summary>/// <param name="ctx"></param>/// <param name="msg"></param>protected override void ChannelRead0(IChannelHandlerContext ctx, IByteBuffer msg){if (msg != null){Console.WriteLine("Receive From Server:" + msg.ToString(Encoding.UTF8));}//ctx.WriteAsync(Unpooled.CopiedBuffer(msg));}public override void ChannelReadComplete(IChannelHandlerContext context){context.Flush();}public override void ChannelActive(IChannelHandlerContext context){Console.WriteLine("==================ChannelActive======================");//context.WriteAndFlushAsync(Unpooled.CopiedBuffer(Encoding.UTF8.GetBytes("Hello World!")));}public override void ChannelInactive(IChannelHandlerContext context){Console.WriteLine("===============ChannelInactive==============");base.ChannelInactive(context);context.CloseAsync();}public override void ExceptionCaught(IChannelHandlerContext context, Exception exception){Console.WriteLine("===============ExceptionCaught==============");Console.WriteLine(exception);context.CloseAsync();}
}
3.新建DotNettyClient.cs客户端类
public class DotNettyClient
{private MultithreadEventLoopGroup group;private Bootstrap bootstrap;private IChannel channel;public async Task StartAsync(){group = new MultithreadEventLoopGroup();try{bootstrap = new Bootstrap().Group(group).Channel<TcpSocketChannel>().Option(ChannelOption.TcpNodelay, true).Handler(new ActionChannelInitializer<ISocketChannel>(channel =>{IChannelPipeline pipeline = channel.Pipeline;pipeline.AddLast(new StringDecoder(Encoding.UTF8));pipeline.AddLast(new StringEncoder(Encoding.UTF8));pipeline.AddLast(new IdleStateHandler(0, 0, 600));pipeline.AddLast(new EchoClientHandler());}));channel = await bootstrap.ConnectAsync("127.0.0.1", 9997);//byte[] bytes = Encoding.UTF8.GetBytes("aaaaa");//await channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(bytes));Console.WriteLine("Connected to server.");// 发送消息给服务器SendMessage("我是客户端");//关闭客户端连接//await channel.CloseAsync();//Console.WriteLine("Client connection closed.");}catch (Exception ex) { Console.WriteLine(ex.ToString());Console.WriteLine(ex.StackTrace);}finally{await group.ShutdownGracefullyAsync();}}public void SendMessage(string message){if (channel != null && channel.Open){Console.WriteLine("666666666666666666666666666");channel.WriteAndFlushAsync(message);Console.WriteLine("Sent message to server: " + message);}}
}
4.使用DotNetty
我这里是窗体应用程序
public partial class Form1 : Form
{public Form1(){InitializeComponent();startClient();}public async Task startClient() {DotNettyClient client = new DotNettyClient();await client.StartAsync();//连接服务//client.SendMessage("111111111111111");}
}
相关文章:
C# DotNetty客户端
1. 引入DotNetty包 我用的开发工具是VS2022,不同工具引入可能会有差异 工具——>NuGet包管理器——>管理解决方案的NuGet程序包 搜索DotNetty 2.新建EchoClientHandler.cs类 用于接收服务器返回数据 public class EchoClientHandler : SimpleChannelIn…...
4G模组SIM卡电路很简单,但也要注意这些坑
上次水SIM卡相关的文章,还是上一次; 上一篇文章里吹牛说,跟SIM卡相关的问题还有很多,目的是为下一篇文章埋下伏笔;伏笔埋是埋下了,但如果债老是不还,心里的石头就总悬着,搞不好老板…...
常见电脑品牌BIOS设置与进入启动项快捷键
常见电脑品牌BIOS与引导项快捷键速查表 | 电脑品牌 | BIOS快捷键 | 引导项快捷键 | 备注 ||------------|------------|--------------|------------------------------ || 联想 | F2/F1 | F12 | 笔记本通常为F2,台式机通常为F1 || IBM/ThinkPad | F1 | 未知 | ||…...
C语言中的日志机制:打造全面强大的日志系统
前言 在软件开发中,良好的日志记录机制对于调试、监控程序状态和维护系统的稳定性至关重要。本文将介绍如何在C语言中构建一个全面强大的日志系统,并提供一些示例代码。 1. 日志的基本概念 日志级别:用于分类日志信息的重要性,…...
局域网广域网,IP地址和端口号,TCP/IP 4层协议,协议的封装和分用
前言 在古老的年代,如果我们要实现两台机器进行数据传输, A员工就得去B员工的办公电脑传数据(B休息,等A传完),这样就很浪费时间 所以能不能不去B的工位的同时,还能传数据。这时候网络通信就出来…...
LabVIEW项目编码器选择
在LabVIEW项目中,选择增量式(Incremental Encoder)和绝对式(Absolute Encoder)编码器取决于项目的具体需求。增量式编码器和绝对式编码器在工作原理、应用场景、精度和成本等方面存在显著差异。以下从多方面详细阐述两…...
Spring Boot实现房产租赁业务逻辑
1 绪论 1.1 研究背景 中国的科技的不断进步,计算机发展也慢慢的越来越成熟,人们对计算机也是越来越更加的依赖,科研、教育慢慢用于计算机进行管理。从第一台计算机的产生,到现在计算机已经发展到我们无法想象。给我们的生活改变很…...
汽车3d动画渲染选择哪个?选择最佳云渲染解决方案
面临汽车3D动画渲染挑战?选择正确的云渲染服务至关重要。探索最佳解决方案,优化渲染效率,快速呈现逼真动画。 汽车3d动画渲染选择哪个? 对于汽车3D动画渲染,选择哪个渲染器取决于你的项目需求、预算和期望的效果。Ble…...
火语言RPA流程组件介绍--网页/元素截图
🚩【组件功能】:对整个网页、可见区域或者某个元素进行截图 ,保存至指定文件夹,仅适用于内置浏览器 配置预览 配置说明 截图类型 整个网页/可见区域/元素截图 目标元素 支持T或# 通过自动捕获工具捕获(选择元素工具使用方法)…...
VSCode编程配置再次总结
VScode 中C++编程再次总结 0.简介 1.配置总结 1.1 launch jsion文件 launch.json文件主要用于运行和调试的配置,具有程序启动调试功能。launch.json文件会启用tasks.json的任务,并能实现调试功能。 左侧任务栏的第四个选项运行和调试,点击创建launch.json {"conf…...
银行管理系统
摘 要 伴随着信息技术与互联网技术的不断发展,人们进到了一个新的信息化时代,传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须,提升管理高效率,各种各样管理管理体系应时而生,各个领域陆续进到…...
极狐GitLab 17.4 重点功能解读【四】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
[每日一练]利用自连接实现数量查询
该题目来源于力扣: 1731. 每位经理的下属员工数量 - 力扣(LeetCode) 题目要求: 表:Employees----------------------- | Column Name | Type | ----------------------- | employee_id | int | | name …...
Linux云计算 |【第四阶段】RDBMS1-DAY3
主要内容: 子查询(单行单列、多行单列、单行多列、多行多列)、分页查询limit、联合查询union、插入语句、修改语句、删除语句 一、子查询 子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一…...
初始MYSQL数据库(8)—— JDBC编程
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: MYSQL 目录 JDBC的概念 JDBC的使用 加载驱动包 建立连接 创建 statement 对象 定义并执行SQL语句 处理结果集 关闭资源 SQL注入 …...
Vue $router.push打开新窗口
Vue $router.push打开新窗口 最近有粉丝小伙伴问我:$router.push方法用于在当前窗口中跳转路由,但有时候我们需要在新的窗口或标签页中打开一个路由改怎么实现呢? 那么这里就介绍下实现逻辑和代码案例! 文章目录 Vue $router.pus…...
SQL进阶技巧:如何利用if语句简化where或join中的条件 | if条件语句的优雅使用方法
目录 0 问题场景 1 数据准备 2 问题分析 2.1 需求一 2.2需求二 3 小结 0 问题场景 有两张表,一张用户下单表user_purchase(用户ID粒度)包含用户ID、订单ID和下单消耗金额和一张用户维表user_info包含用户ID、用户年龄和用户是否实名认证。 user_purchase user_info 需…...
SpringCloud-Alibaba第二代微服务快速入门
1.简介 Spring Cloud Alibaba其实是阿里的微服务解决方案,是阿里巴巴结合自身微服务实践,开源的微服务全家桶,在Spring Cloud项目中孵化成为Spring Cloud的子项目。第一代的Spring Cloud标准中很多组件已经停更,如:Eureak,zuul等。所以Sprin…...
JSON字符串转换成对象
在Java中,将JSON字符串转换成对象是一个常见的操作,特别是在处理Web服务或API时。这通常通过使用第三方库来实现,因为Java标准库(Java SE)本身并不直接支持JSON的序列化和反序列化。最常用的库之一是Jackson和Gson。下…...
第三十五章 结合加密和签名
文章目录 第三十五章 结合加密和签名使用非对称密钥签名并加密使用非对称密钥加密并签名 第三十五章 结合加密和签名 可以在同一条消息中加密和签名。在大多数情况下,只需组合前面主题中给出的方法即可。本主题讨论了多种场景。 使用非对称密钥签名并加密 要签名…...
42-西门子1200伺服控制5轴程序 程序采用1200系列PLC,项目实现以下功能: (1)
42-西门子1200伺服控制5轴程序 程序采用1200系列PLC,项目实现以下功能: (1).三轴机械手联动取放料PTO脉冲定位控制台达B2伺服 (2).台达伺服速度模式应用扭矩模式应用实现收放卷 (3).…...
从音频生成到DNA分析:手把手带你用S4和Hyena搞定Transformer不擅长的那些长序列任务
从音频生成到DNA分析:手把手带你用S4和Hyena搞定Transformer不擅长的那些长序列任务 当我们需要处理长达数小时的音频波形、百万碱基对的DNA序列或整本小说级别的文本时,传统Transformer架构很快就会遇到计算瓶颈。本文将带您探索两种突破性的序列建模方…...
MedGemma 1。5在Linux环境下的部署与优化
MedGemma 1.5在Linux环境下的部署与优化 1. 引言 MedGemma 1.5是谷歌最新发布的开源医疗AI模型,专门针对医学影像和文本数据处理进行了深度优化。这个40亿参数的轻量级模型不仅能处理CT、MRI等三维医学影像,还能分析病理切片和电子健康记录,…...
【CPython 3.13无锁并发白皮书】:全球首批实测团队披露的4类典型崩溃场景与修复参数
第一章:Python 无锁 GIL 环境下的并发模型配置概览Python 的全局解释器锁(GIL)本质上限制了 CPython 中多线程对 CPU 密集型任务的并行执行能力。然而,“无锁 GIL 环境”并非指 GIL 被移除,而是指通过绕过 GIL 依赖的并…...
Comsol异构电池力电热耦合模型:探索电池的多场奥秘
comsol异构电池力电热耦合模型 采用椭圆型电极颗粒模拟锂离子正负极的电极颗粒,还原真实电池的3D介观结构,耦合电化学场-热场-力学场,可模拟电流,浓度,温度,应力等多场结果在电池研究领域,深入理…...
uniapp中如何用lottie-miniprogram加载json动画?5分钟搞定炫酷效果
Uniapp中5分钟集成Lottie动画:从原理到实战的完整指南 在移动应用开发中,精美的动画效果往往能显著提升用户体验。对于Uniapp开发者来说,Lottie-miniprogram提供了一种高效的方式,可以直接加载设计师导出的JSON动画文件࿰…...
1949–2024年中国县级行政区划(逐年)|全国范围、75年连续、SHP格式
🔍 数据简介 本数据集完整覆盖 1949年至2024年 共 76个年份 的中国县级行政区划边界,是目前公开可获取的时间跨度最长、更新粒度最细的全国县级历史区划产品。 每一年份均提供独立、闭合、无重叠的面状矢量边界,属性表包含标准名称、行政区划…...
手把手推导NCP1380准谐振反激公式:用Mathcad复现ON官方计算书(附推导过程)
从零推导NCP1380准谐振反激公式:Mathcad实战全解析 当电源工程师第一次打开NCP1380官方计算书时,那些看似魔术般直接呈现的公式往往让人既兴奋又困惑。兴奋的是有了现成的设计工具,困惑的是这些公式背后的物理本质和数学逻辑被隐藏在技术文档…...
基于imfindcircles函数的圆形检测实战:从原理到MATLAB实现
1. 霍夫变换与圆形检测原理 第一次接触圆形检测时,我也被各种数学公式绕得头晕。直到把霍夫变换想象成"投票游戏",才真正理解它的精妙之处。想象一张布满黑白点的图纸,每个黑点都可能属于某个潜在的圆。霍夫变换就像让每个黑点为所…...
从零构建一个轻量级WebSocket服务器:基于libwebsockets的实战与事件循环剖析
从零构建一个轻量级WebSocket服务器:基于libwebsockets的实战与事件循环剖析 在当今实时应用盛行的时代,WebSocket技术已成为构建即时通讯、实时数据推送等功能的基石。不同于传统的HTTP请求-响应模式,WebSocket提供了全双工通信能力…...
