.Net网络通信组件 - TouchSocket

devtools/2024/9/24 2:23:49/

文章目录

  • .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.ppmy.cn/devtools/116274.html

相关文章

Qt 学习第十天:小项目:QListWidget的使用

一、页面布局 二、命名按钮 双击按钮可以修改显示中的文字&#xff08;例如&#xff1a;改成“全选”&#xff09;&#xff0c;objectName是要改成程序员所熟悉的名字&#xff08;英文&#xff0c;符合代码规范&#xff09;方便修改和书写代码&#xff0c;一看就能看懂的 三、…

linux-系统备份与恢复-备份工具

Linux 系统备份与恢复&#xff1a;备份工具 备份和恢复是 Linux 系统管理中的关键任务之一。有效的备份策略可以在数据丢失、系统崩溃或硬件故障时&#xff0c;帮助管理员快速恢复系统&#xff0c;避免数据丢失带来的严重后果。Linux 提供了多种备份工具&#xff0c;支持不同的…

乐观锁、悲观锁及死锁

乐观锁、悲观锁 1.概念 悲观锁(悲观锁定)&#xff1a;具有强烈的独占和排他特性。在整个执行过程中&#xff0c;将处于锁定状态。悲观锁在持有数据的时候总会把资源或者数据锁住&#xff0c;这样其他线程想要请求这个资源的时候就会阻塞&#xff0c;直到等到悲观锁把资源释放为…

828华为云征文 | 将Vue项目部署到Flexus云服务器X实例并实现公网访问

一、Flexus云服务器X实例简介 1.1 概述 华为云Flexus X实例是华为云推出的一款创新云服务器产品&#xff0c;它主要面向中小企业和开发者&#xff0c;旨在解决传统云服务中的痛点&#xff0c;提供更加灵活、高效的云服务体验。 华为深刻洞察了中小企业和开发者在云服务应用中遇…

思维商业篇(5)—发展趋势分析

思维商业篇(5)—发展趋势分析 核心理论 巴菲特曾在《滚雪球》一书中提到他的投资之道其实非常简单&#xff0c;可以总结为两句话&#xff1a;找到足够长的雪道&#xff0c;找到足够湿的雪球。 而发展趋势的分析&#xff0c;正好可以借助巴菲特的这个滚雪球理论。 足够长的雪…

vue3 axios ant-design-vue cdn的方式使用

1、vue3 快速上手 | Vue.js <script src"https://unpkg.com/vue3/dist/vue.global.js"></script><div id"app">{{ message }}</div><script>const { createApp, ref } VuecreateApp({setup() {const message ref(Hello …

PCIe进阶之TL:Request Handling Rules

1 Handling of Received TLPs 本节介绍接收到的 TLP 在数据链路层经过完整性验证之后,这些 TLP 在事务处理层时的处理方式。这些规则如下图所示: 接收侧会忽略保留字段。如果 Fmt 字段显示存在至少一个 TLP Prefix : (1)通过检查后续 DWORD 的第一个字节中的 Fmt 字段,…

408算法题leetcode--第七天

283. 移动零 283. 移动零思路&#xff1a;代码中注释阐述时间&#xff1a;O(n)&#xff1b;空间&#xff1a;O(1) class Solution { public:void moveZeroes(vector<int>& nums) {// 简单思路&#xff1a;用一个辅助数组&#xff0c;将非0元素复制到里面// 双指针&…