.Net网络通信组件 - TouchSocket

文章目录

  • .Net网络通信组件 - TouchSocket
    • 1、新建.Net8控制台项目
    • 2、Nuget安装TouchSocket组件
    • 3、编写服务端代码
    • 4、编写客户端代码
    • 5、编写Program代码
    • 6、运行效果
    • 7、日志组件(NLog)参考我的另一篇博客

.Net网络通信组件 - TouchSocket

1、新建.Net8控制台项目

2、Nuget安装TouchSocket组件

install-package TouchSocket

3、编写服务端代码


using System.Text;
using TestTouchSocketApp.TouchSockets.Dtos;
using TouchSocket.Core;
using TouchSocket.Sockets;namespace TestTouchSocketApp.TouchSockets
{public class TestTouchSocketServer{public TestTouchSocketServer(){//初始化服务端InitServer();}public TcpService TcpService { get; set; }public List<TouchSocketClientDto> Clients { get; set; }/// <summary>/// 初始化服务端/// </summary>private void InitServer(){//初始化TcpService = new TcpService();//初始化Clients = new();TcpService.Connecting += (client, e) =>{//返回return EasyTask.CompletedTask;};TcpService.Connected += (client, e) =>{//初始化TouchSocketClientDto clientDto = new();//赋值clientDto.Index = Clients.Count + 1;clientDto.ClientId = client.Id;clientDto.Host = client.IP;clientDto.Port = client.Port;clientDto.Online = true;clientDto.ConnectTime = DateTime.Now;//添加Clients.Add(clientDto);//记录日志LingbugLogUtil.Info($"有新客户端上线啦:{TouchSocketClientDto.GetContentStr(clientDto)}");//返回return EasyTask.CompletedTask;};TcpService.Received += (client, e) =>{try{//读取var bytes = e.ByteBlock.ToArray();//读取var clientMsg = Encoding.UTF8.GetString(bytes);//logstring log = $"Server Received,收到客户端发送的消息:【{clientMsg}】";//记录日志LingbugLogUtil.Info(log);}catch (Exception exception){//记录日志LingbugLogUtil.Error($"Server Received,读取客户端消息异常:{exception.Message}", exception);}//返回return EasyTask.CompletedTask;};TcpService.Closing += (client, e) =>{//返回return EasyTask.CompletedTask;};TcpService.Closed += (client, e) =>{foreach (var clientDto in Clients.FindAll(r => r.ClientId == client.Id)){//赋值clientDto.Online = false;clientDto.DisConnectTime = DateTime.Now;//记录日志LingbugLogUtil.Info($"客户端已下线:{TouchSocketClientDto.GetContentStr(clientDto)}");}//返回return EasyTask.CompletedTask;};//初始化var config = new TouchSocketConfig();//赋值config.SetListenIPHosts(new IPHost[] { "127.0.0.1:9990", "127.0.0.1:9991" });config.SetMaxCount(100);config.SetThreadCount(10);//配置TcpService.Setup(config);//启动TcpService.Start();//打印LingbugLogUtil.Info("server is started,listening on 127.0.0.1:9990,127.0.0.1:9991");}/// <summary>/// 获取在线客户端/// </summary>/// <returns></returns>public List<TouchSocketClientDto> GetConnectedClients(){//数据var clients = Clients ?? new();//过滤return clients.FindAll(r => r.Online);}/// <summary>/// 发送消息/// </summary>/// <param name="clientId"></param>/// <param name="msg"></param>public void SendMsg(string clientId, string msg){//发送消息TcpService.Send(clientId, msg);}}
}

4、编写客户端代码


using System.Text;
using TouchSocket.Core;
using TouchSocket.Sockets;namespace TestTouchSocketApp.TouchSockets
{public class TestTouchSocketClient{public TestTouchSocketClient(string listenServer){//初始化客户端InitClient(listenServer);}public TcpClient TcpClient { get; set; }/// <summary>/// 初始化客户端/// </summary>/// <param name="listenServer"></param>private void InitClient(string listenServer){//初始化TcpClient = new TcpClient();TcpClient.Connecting += (client, e) =>{//返回return EasyTask.CompletedTask;};TcpClient.Connected += (client, e) =>{//返回return EasyTask.CompletedTask;};TcpClient.Received += (client, e) =>{try{//读取var bytes = e.ByteBlock.ToArray();//读取var serverMsg = Encoding.UTF8.GetString(bytes);//logstring log = $"Client Received,收到服务器发送的消息:【{serverMsg}】";//记录日志LingbugLogUtil.Info(log);}catch (Exception exception){//记录日志LingbugLogUtil.Error($"Client Received,读取服务器消息异常:{exception.Message}", exception);}//返回return EasyTask.CompletedTask;};TcpClient.Closing += (client, e) =>{//返回return EasyTask.CompletedTask;};TcpClient.Closed += (client, e) =>{//返回return EasyTask.CompletedTask;};//初始化var config = new TouchSocketConfig();//赋值config.SetRemoteIPHost(new IPHost(listenServer));//配置TcpClient.Setup(config);//启动TcpClient.Connect();//打印LingbugLogUtil.Info($"client is connected to server,server is {listenServer}");}/// <summary>/// 发送消息/// </summary>/// <param name="msg"></param>public void SendMsg(string msg){//发送消息TcpClient.Send(msg);}}
}

5、编写Program代码


using TestTouchSocketApp.TouchSockets;
using TestTouchSocketApp.TouchSockets.Dtos;namespace TestTouchSocketApp
{internal class Program{static void Main(string[] args){try{//打印Console.WriteLine("请输入,1:服务端;2:客户端;");//读取var input = Console.ReadLine();if (input == "1"){//初始化TestTouchSocketServer server = new();//打印Console.WriteLine("请输入要发送给客户端的消息:");//读取var msg = Console.ReadLine();//打印Console.WriteLine("要发送给哪个客户端,当前连接的客户端有:");//获取在线客户端var clients = server.GetConnectedClients();foreach (var client in clients){//打印Console.WriteLine(TouchSocketClientDto.GetContentStr(client));}//读取var clientId = Console.ReadLine();//发送消息server.SendMsg(clientId, msg);}else if (input == "2"){//打印Console.WriteLine("请输入要连接的服务端地址:");//读取var server = Console.ReadLine();//初始化TestTouchSocketClient client = new(server);//打印Console.WriteLine("请输入要发送给服务器的消息:");//读取var msg = Console.ReadLine();//发送消息client.SendMsg(msg);}}catch (Exception e){//记录日志LingbugLogUtil.Error($"程序异常:{e.Message}", e);}//读取Console.ReadKey();}}
}

6、运行效果

在这里插入图片描述

7、日志组件(NLog)参考我的另一篇博客

.Net日志组件之NLog的使用和配置

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

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

相关文章

图像处理软件,常用于照片编辑和修饰

一、简介 1、一款功能强大的图像处理软件&#xff0c;常用于照片编辑和修饰。它提供多种工具和特效&#xff0c;允许用户调整照片的亮度、对比度、色彩、锐化等 二、下载 1、文末有下载链接,不明白可以私聊我哈&#xff08;麻烦咚咚咚&#xff0c;动动小手给个关注收藏小三连&a…

Apache的ab压力测试工具与性能监控

【图书介绍】《软件性能测试、分析与调优实践之路&#xff08;第2版&#xff09;》_软件性能测试分析与调优实践之路-CSDN博客《软件性能测试、分析与调优实践之路&#xff08;第2版&#xff09;》(张永清)【摘要 书评 试读】- 京东图书 (jd.com) Apache的ab压力测试工具 A…

分布式Redis(14)哈希槽

文章目录 一致性哈希算法理论普通哈希的问题一致性hash算法 Redis 使用哈希槽Redis Cluster集群 为什么Redis是使用哈希槽而不是一致性哈希呢&#xff1f;为什么Redis Cluster哈希槽数量是16384&#xff1f; 关键词&#xff1a;一致性 Hash&#xff0c;哈希槽&#xff0c; 带着…

react的组件的概念和使用

文章目录 1. **组件的定义****函数组件****类组件** 2. **组件的生命周期**3. **状态管理****类组件中的状态管理****函数组件中的状态管理** 4. **组件之间的通信****通过 Props 传递数据****上下文&#xff08;Context&#xff09;** 5. **组件的样式**6. **处理表单**7. **错…

51单片机-AD(模拟信号转数字信号)-实验()

介绍AD AD转换&#xff08;Analog to Digital Conversion&#xff0c;模数转换&#xff09;是将连续的模拟信号转换为离散的数字信号的过程。这个过程在各种电子设备中都非常重要&#xff0c;特别是在涉及传感器、音频信号、视频信号等需要进行数字化处理的领域。 个人理解&a…

正也科技-辖区与指标管理系统 强化决策支持

正也科技的“辖区与指标管理系统”设计理念先进&#xff0c;旨在通过科学合理的组织架构和精细化的指标管理&#xff0c;帮助企业实现更高效的市场布局、人员配置及业绩监控。以下是对该系统核心功能的进一步阐述及其对企业运营带来的优势&#xff1a; 正也科技辖区管理 1. 组…

最新PyCharm安装详细教程及pycharm配置

目录 一、PyCharm简介及其下载网站 二、单击网站的Downloads&#xff0c;进入二级页面&#xff0c;选择对应的操作系统下载PyCharm 三、PyCharm的安装程序的安装及其配置(configuration) 1、运行PyCharm Setup 2、安装位置设置 3、安装选项设置 4、开始菜单中PyCharm快捷方式的…

【Git使用】删除Github仓库中的指定文件/文件夹

前言&#xff1a; 上篇文章带大家上传了第一个项目至github,那要是想删除仓库中的指定文件夹怎么办&#xff1f;在Github中 仓库是无法通过鼠标操作直接删除文件和文件夹的&#xff0c;那只能通过 git 命令来执行删除操作。接下来就带大家进行操作。 详细步骤&#xff1a; 一…

AI大语言模型的全面解读

大语言模型&#xff08;Large Language Models, LLMs&#xff09;无疑是近年来最耀眼的星辰之一。他们以惊人的语言生成能力、上下文理解能力以及对复杂任务的泛化能力&#xff0c;正在深刻改变着自然语言处理&#xff08;NLP&#xff09;乃至整个AI领域的格局。 本文将从专业角…

C++速通LeetCode中等第10题-轮转数组(四种方法)

方法一&#xff1a;巧用deque双向队列容器 class Solution { public:void rotate(vector<int>& nums, int k) {deque<int> q;int tmp;if(nums.size() > 1){for(auto num:nums) q.push_back(num);for(int i 0;i < k;i){tmp q.back();q.pop_back();q.pu…

基于YOLOv8+LSTM的商超扶梯场景下行人安全行为姿态检测识别

基于YOLOv8LSTM的商超扶梯场景下行人安全行为姿态检测识别 手扶电梯 行为识别 可检测有人正常行走&#xff0c;有人 跌倒&#xff0c;有人逆行三种行为 跌倒检测 电梯跌倒 扶梯跌倒 人体行为检测 YOLOv8LSTM。 基于YOLOv8LSTM的商超扶梯场景下行人安全行为姿态检测识别&#xf…

Qt 状态机编程,双层状态机,实现暂停恢复

流程设计状态图 #ifndef WORKMACHINE_H #define WORKMACHINE_H#include <QObject> #include <QStateMachine> #include <QHistoryState> #include <QFinalState>#include "WorkThread.h"class WorkMachine : public QObject {Q_OBJECT publ…

记录可编辑表格(未完整)

每一行都独立 <el-table-column label"操作" width"220" fixed"right"><template #default"{ row, $index }"><el-buttonv-if"!row.tableEditFlag"type"primary"size"small"click"…

螺栓与散装物体检测系统源码分享

螺栓与散装物体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

[云服务器12] 搭建eaglercraft网页MC

众所周知&#xff0c;MC是一个炒鸡好玩的游戏&#xff01; 但是&#xff0c;Mojang开发出来是经过Java JAR打包过的的.jar文件&#xff0c;这就不得不依赖HMCL PCL BakaXL等启动器来启动了…… 所以今天&#xff0c;我们将使用开源的eaglercraft来搭建一个在线版MC&#xff0…

誉龙视音频 Third/TimeSyn 远程命令执行复现

0x01 漏洞描述&#xff1a; 誉龙公司定位为系统级的移动视音频记录解决方案提供商&#xff0c;凭借其深厚的行业经验&#xff0c;坚持自主研发&#xff0c;匠心打造记录仪领域行业生态&#xff0c;提供开放式的记录仪APK、GB28181 SDK、国网B协议、管理平台软件OEM。誉龙视音频…

C/S架构与B/S架构的适用场景分析

C/S架构&#xff08;客户端/服务器架构&#xff09;与B/S架构&#xff08;浏览器/服务器架构&#xff09;在适用场景上各有特点&#xff0c;主要取决于应用的具体需求、用户群体、系统维护成本、跨平台需求等因素。 一、C/S架构的适用场景 1、高性能与交互性要求高的应用&…

9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案

面向服务的架构&#xff08;Service Oriented Architecture, SOA&#xff09;实施需要复杂的基础技术作为支撑&#xff0c;伴随着整车硬件资源的集中化、车载以太网等高速通信技术在车内的部署&#xff0c;将在未来一段时间内成为行业技术研究和市场布局的热点。 近年来&#x…

使用Webpack创建vue脚手架并搭建路由---详解

1.使用 vue 库 vue 是一个非常好用的 javascript 库&#xff0c;现在已经发行了 vue 3&#xff0c;我们可以直接导入使用库文件&#xff0c;也可以使用单文件&#xff08;SFC&#xff09;的形式&#xff0c;直接使用库文件会简单一点&#xff0c;我们先来试一下吧。 1.1安装 v…

JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操

JdbcTemplate是Spring框架中的一个重要组件&#xff0c;主要用于简化JDBC数据库操作。它提供了许多常用的方法&#xff0c;如查询、插入、更新、删除等。本文将介绍JdbcTemplate的常用方法及其使用方式&#xff0c;以及参数绑定和删除数据的方法。 一、JdbcTemplate常用方法 查…