.net中用标志位解决socket粘包问题

以下为wpf中, 用标志位"q" 解决粘包问题

using MyFrameWorkWpf.Entities;
using System.Collections.ObjectModel;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Controls;namespace MyFrameWorkWpf.ViewModels
{public partial class TcpServerViewModel : ObservableObject{public TcpServerViewModel(){myIp = "192.168.2.100";myPort = "8888";}//声明一个Socket对象private Socket socketServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);private CancellationTokenSource cts = new();private ManualResetEvent resetEvent = new ManualResetEvent(true);private static readonly object lockObj = new object(); // 创建一个对象作为锁private readonly MyRArr myRArr;//创建字典集合,键是ClientIp,值是SocketClientprivate Dictionary<string, Socket> currentClientlist = new Dictionary<string, Socket>();private ObservableCollection<string> serverList = new();public ObservableCollection<string> ServerList{get => serverList;set => SetProperty(ref serverList, value);}private string myIp = "";public string MyIp{get => myIp;set => SetProperty(ref myIp, value);}private string myPort = "";public string MyPort{get => myPort;set => SetProperty(ref myPort, value);}private ObservableCollection<TcpMessage> reciveData = new();public ObservableCollection<TcpMessage> ReciveData{get => reciveData;set => SetProperty(ref reciveData, value);}private string sendTxt = "";public string SendTxt{get => myPort;set => SetProperty(ref myPort, value);}private bool isEnabled = true;public bool IsEnable{get => isEnabled;set => SetProperty(ref isEnabled, value);}public RelayCommand<RadioButton> SelectView { get; private set; }//public RelayCommand<Button> ConnCommand => new RelayCommand<Button>((args) =>//{//    if (!(args is Button button)) return;//});public RelayCommand<Button> ConnCommand =>new RelayCommand<Button>((args) =>{if (!(args is Button button)) return;if (MyIp != null && MyPort != null){IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(MyIp), int.Parse(this.MyPort));try{socketServer.Bind(ipe);}catch (Exception ex){MessageBox.Show(ex.Message);return;}MessageBox.Show("服务器开启成功");button.IsEnabled = false;//IsEnabled = false;//只监听一个socketServer.Listen(1);//创建一个监听的线程Task.Run(new Action(async () =>{while (!cts.IsCancellationRequested){// 第四步:调用accept()函数来接受客户端的连接,这是就可以和客户端通信了。Socket? socketClient = socketServer.Accept();string? client = socketClient?.RemoteEndPoint?.ToString();if (socketClient != null && client != null){currentClientlist.Add(client, socketClient);Application.Current.Dispatcher.Invoke(() =>{ServerList.Add(client);});await Task.Delay(500);// 创建一个缓冲区while (!cts.IsCancellationRequested){byte[] buffer = new byte[1024 * 1024 * 10];int length = -1;// 第五步:处理客户端的连接请求。try{//length = socketClient.ReceiveFrom(buffer, 0, 8192, SocketFlags.None, ref remoteEP);if (ServerList.Count > 0){length = currentClientlist[ServerList[0]].Receive(buffer);}}catch (Exception ex){ServerList.Remove(client);currentClientlist.Remove(client);MessageBox.Show(ex.Message);break;}if (length > 0){byte[] temp = new byte[length];//buffer复制到tempArray.Copy(buffer, 0, temp, 0, length);byte[] separator = Encoding.UTF8.GetBytes("q");//q所在的索引位置int idx = Array.IndexOf(buffer, separator[0], 0, length);if (idx >= 0){var data = Encoding.ASCII.GetString(temp);var res = data.Substring(0, idx); //截取索引之前的数据TcpMessage tcpMessage = new();lock (lockObj){tcpMessage.DateTime = DateTime.Now;tcpMessage.Message = res;tcpMessage.Client = ServerList[0];}Application.Current.Dispatcher.Invoke(() =>{ReciveData.Add(tcpMessage);});}//string msg = string.Empty;//msg = Encoding.ASCII.GetString(buffer, 0, length);//TcpMessage tcpMessage = new();//lock (lockObj)//{//    tcpMessage.DateTime = DateTime.Now;//    tcpMessage.Message = msg;//    tcpMessage.Client = ServerList[0];//}//Application.Current.Dispatcher.Invoke(() =>//{//    ReciveData.Add(tcpMessage);//});}}}}}),cts.Token);}else{MessageBox.Show("Ip,端口号不能为空!");}});public RelayCommand DisConnCommand => new RelayCommand(() => { });public RelayCommand SendMsgCommand =>new RelayCommand(() =>{byte[] send = Encoding.ASCII.GetBytes(SendTxt);//创建最终发送的数组byte[] sendMsg = new byte[send.Length];//整体拷贝数组Array.Copy(send, 0, sendMsg, 0, send.Length);if (ServerList.Count > 0){string client = ServerList[0];currentClientlist[client]?.Send(sendMsg);}SendTxt = string.Empty;});public RelayCommand EditCommand => new RelayCommand(() => { });}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边缘计算网关

一、项目整体框架图 二、项目整体描述 边缘计算网关项目主要实现了智能家居场景和工业物联网场景下设备的数据采集和控制。 整个项目分为三大层&#xff1a;用户接口层、网关层、设备层。 其中用户层通过QT客户端、WEB界面及阿里云提供数据展示和用户接口。 网关使用虚拟机代替…

ArcGIS Engine:实现Shp/Mxd数据的加载、图层的简单查询

本博客参考&#xff1a;BiliBili UP主 <羊羊旸> &#xff1a; Arcgis Engine学习 目录 01 加载控件以及控件的基本信息等调整 02 编写 <菜单-地图控件> 中各个子工具的代码 2.1 加载Shapefile数据-代码 2.2 加载地图文档数据-代码 2.3 获取图层数量-代码 2.…

如何从零开始系统的学习项目管理?

一、项目的概念 根据项目管理协会&#xff08;PMI&#xff09;的定义&#xff0c;项目是指为了创造独特的产品、服务或成果而进行的临时性工作。这意味着项目需要有明确的目标&#xff0c;且不是日常重复性工作。尽管项目是临时性工作&#xff0c;但它所交付的成果可能会持续存…

汽车冲压车间的RFID技术设计解决方案

一、RFID技术的基本原理 RFID技术是一种利用非接触式自动识别的技术&#xff0c;通过将RFID标签放置在被识别物品上&#xff0c;并使用RFID读写器对标签进行扫描和识别&#xff0c;实现对物品的自动识别和追踪。RFID标签分为被动式和主动式两种。被动式标签无内置电源&#xf…

解决远程git服务器路径改变导致本地无法push的问题

解决远程git服务器路径改变导致本地无法push的问题 &#xff08;1&#xff09;第一步&#xff1a;查看git配置 git config -l&#xff08;2&#xff09;第二步&#xff1a;删除远程git地址 git remote remove origin&#xff08;3&#xff09;第三步&#xff1a;再次查看git配…

Vue3 + Ts实现NPM插件 - 定制loading

目录 你的 Loading&#x1f916; 安装&#x1f6f9; 简介苍白请 您移步文档&#xff1a;✈️ 使用方法&#x1f6e0;️ 配置 loading 类型&#x1f3b2; 定制 loading 色彩 &#x1f4a1; 注意事项 前期回顾 你的 Loading 开箱即可用的 loading&#xff0c; 说明&#xff1a;vu…

Java练习题-用冒泡排序法实现数组排序

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java练习题 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又…

MySql017——组合查询UNION和UNION ALL

一、UNION作用 可用UNION操作符来组合数条SQL查询。 二、UNION 使用规则 1、UNION的使用很简单。所需做的只是给出每条SELECT语句&#xff0c;在各条语句之间放上关键字UNION。2、UNION必须由两条或两条以上的SELECT语句组成&#xff0c;语句之间用关键字UNION分隔&#xff…

Mac mov转mp4,详细转换步骤

Mac mov转mp4怎么转&#xff1f;视频文件格式为.mov是由Apple公司所开发的特殊格式。因其只能在苹果设备上播放&#xff0c;与他人分享时就会变得困难。为此&#xff0c;我们通常会选择使用MP4这种最受欢迎的视频格式。在日常使用中&#xff0c;MP4成为了大家首选的视频格式。而…

Vulnhub系列靶机-The Planets Earth

文章目录 Vulnhub系列靶机-The Planets: Earth1. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测2.1 XOR解密2.2 解码 3. 漏洞利用3.1 反弹Shell 4. 权限提升4.1 NC文件传输 Netcat&#xff08;nc&#xff09;文件传输 Vulnhub系列靶机-The Planets: Earth 1. 信息…

【管理运筹学】第 9 章 | 网络计划(1,网络图的组成及绘制)

文章目录 引言一、网络图的组成及绘制1.1 网络图的组成1. 基本要素2. 线路与关键线路3. 网络图的类型 1.2 网络图的绘制1. 画图原则2. 绘图一般步骤 写在最后 引言 大纲里关于网络计划这一章的描述&#xff0c;就两个&#xff0c;一个是基本概念&#xff1a;网络计划、时间参数…

计算机竞赛 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

API网关是什么?

API网关是什么&#xff1f; API网关很多人都知道它的实现原理&#xff0c;但是并不清楚它存在的意义和背景是什么&#xff0c;这里我给大家通俗易懂地讲解下&#xff01;举个例子&#xff0c;假设你正在开发一个电商网站&#xff0c;那么这里会涉及到很多后端的微服务&#xf…

排序算法之【归并排序】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

postman测试文件上传接口教程

postman是一个很好的接口测试软件&#xff0c;有时候接口是Get请求方式的&#xff0c;肯定在浏览器都可以测了&#xff0c;不过对于比较规范的RestFul接口&#xff0c;限定了只能post请求的&#xff0c;那你只能通过工具来测了&#xff0c;浏览器只能支持get请求的接口&#xf…

【计算机网络】poll | epoll

文章目录 1. pollpoll函数参数解析代码解析PollServer代码 poll 特点 2. epoll认识接口epoll_createepoll_ctlepoll_wait 基本原理红黑树就绪队列 1. poll poll函数参数解析 输入 man poll poll的第一个参数是文件描述符 poll的第二个参数为 等待的多个文件描述符(fd)数字层面…

点云分割segmentation

点云分割是根据空间、几何和纹理等特征对点云进行划分&#xff0c;使得同一划分区域内的点云拥有相似的特征 。点云的有效分割往往是许多应用的前提。例如&#xff0c;在逆向工程CAD/CAM 领域&#xff0c;对零件的不同扫描表面进行分割&#xff0c;然后才能更好地进行孔洞修复、…

Go 并发编程

并发编程 1.1 并发与并⾏ 并⾏与并发是两个不同的概念&#xff0c;普通解释&#xff1a; 并发&#xff1a;交替做不同事情的能⼒并⾏&#xff1a;同时做不同事情的能⼒ 如果站在程序员的⻆度去解释是这样的&#xff1a; 并发&#xff1a;不同的代码块交替执⾏并⾏&#xf…

蓝牙技术|Matter或能改变中国智能家居市场,蓝牙技术将得到进一步应用

近年来&#xff0c;智能家居开放协议标准Matter&#xff08;目前版本 1.1&#xff09;由连接标准联盟发布&#xff0c;该联盟是一个由数百家公司组成的全球性机构&#xff0c;旨在提供与物联网 (IoT) 相关的标准。例如&#xff0c;Matter 用于允许 Amazon Alexa、Apple Home、G…

宝塔面板二次元透明主题美化模板

看惯了宝塔面板默认风格模板&#xff0c;我们可以试试自己美化修改&#xff0c;我的站长站知道一款非常漂亮的宝塔面板二次元透明主题美化模板&#xff0c;美不美大家看下图&#xff0c;分享给大家。 下载&#xff1a;飞猫盘&#xff5c;文件加速传输工具&#xff5c;云盘&…