.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(() => { });}
}相关文章:
.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.…...
【Ubuntu】Systemctl 管理 MinIO 服务器的启动和停止
要使用 systemctl 来管理 MinIO 服务器的启动和停止,您需要创建一个 systemd 服务单元文件,以便 systemd 能够启动和停止 MinIO 服务器。下面是一般的步骤: 创建 systemd 服务单元文件: 打开终端并使用文本编辑器创建一个新的 sys…...
《golang设计模式》第二部分·结构型模式-07-代理模式(Proxy)
文章目录 1. 概述1.1 角色1.2 模式类图 2. 代码示例2.1 设计2.2 代码2.3 示例类图 1. 概述 代理(Proxy)是用于控制客户端访问目标对象的占位对象。 需求:在调用接口实现真是主题之前需要一些提前处理。 解决:写一个代理ÿ…...
Jmeter常用线程组设置策略
一、前言 在JMeter压力测试中,我们时常见到的几个场景有:单场景基准测试、单场景并发测试、单场景容量测试、混合场景容量测试、混合场景并发测试以及混合场景稳定性测试 在本篇文章中,我们会用到一些插件,在这边先给大家列出&…...
【Spring】Spring MVC 程序开发
Spring MVC 程序开发 一. 什么是 Spring MVC1. MVC2. Spring、Spring Boot 与 Spring MVC 二. 创建 Spring MVC 项目1. 创建项目2. 用户和程序的映射3. 获取用户请求参数①. 获取单个参数②. 获取多个参数③. 传递对象④. 后端参数重命名(后端参数映射)R…...
如何在企业网站里做好网络安全
在当今数字时代,网站不仅仅是企业宣传和产品展示的平台,更是日常生活和商业活动中不可或缺的一部分。然而,随着网络技术不断发展,网站的安全问题日益凸显。保护网站和用户数据的安全已经成为至关重要的任务,以下是一些…...
windows server 2012 服务器打开系统远程功能
服务器上开启远程功能 进入服务器,选择“添加角色和功能” 需要选择安装的服务器类型,如图所示 然后在服务器池中选择你需要使用的服务器。 选择完成后,在图示列表下勾选“远程桌面服务” 再选择需要安装的功能和角色服务。 选择完成确认内容…...
智能工厂MES系统,终端设备支持手机、PDA、工业平板、PC
一、开源项目简介 源计划智能工厂MES系统(开源版) 功能包括销售管理,仓库管理,生产管理,质量管理,设备管理,条码追溯,财务管理,系统集成,移动端APP。 二、开源协议 使用GPL-3.0开…...
GPT的优势和GPT缺点
GPT,即Generative Pre-trained Transformer,是一种基于人工智能技术的自然语言处理模型。它采用了深度学习算法,可以通过大量的文本数据来学习自然语言的规律,并能够生成流畅、准确的语句。下面我们将探讨GPT技术的优势。 首先&a…...
微信小程序开发缺少中间证书问题(腾讯云、阿里云等做服务器)
项目使用nginx做负载均衡后,不再采用原来直接用jar包的方式直接开启对应端口,所以需要重新从云服务器上下载证书,写入到Nginx读取的证书路径上即可。...
动态代理初步了解
准备案例 需求 模拟某企业用户管理业务,需包含用户登录,用户删除,用户查询功能,并要统计每个功能的耗时。 分析与实现 定义一个UserService表示用户业务接口,规定必须完成用户登录,用户删除,…...
QT国际化
引入 在代码里面写中文就很low,运行时多语言切换是客户端程序都应该具备的。 qt国际化其实就是qt中字符串的字符集编码的设置。当然这个设置不是简单的选择一下什么语言就好,这个需要编程人员来处理的。 通常对于非拉丁字符(主要指latin1字符…...
微信小程序button按钮去除边框去除背景色
button边框 去除button边框 在button上添加plain“true”在css中添加button.avatar-wrapper {background: none}用于去除button背景色在css中添加button.avatar-wrapper[plain]{ border:0 }用于去除button边框...
Neo4j深度学习
Neo4j的简介 Neo4j是用Java实现的开源NoSQL图数据库。从2003年开始开发,2007年正式发布第一版,其源码托管于GitHtb。Neo4j作为图数据库中的代表产品,已经在众多的行业项目中进行了应用,如:网络管理、软件分析、组织和…...
【数据结构C/C++】链式存储与顺序存储结构栈
文章目录 链式存储结构顺序存储结构 下面这篇文章是我大二时候写的比较详细的实现过程,再这篇文章我也会再一次比较简单的再次简述一下链式与顺序存储结构的实现方式。 链式存储结构与顺序存储结构详解 这里我就不使用C再一次实现这两个栈了,有兴趣的也可…...
【数据库系统概论】数据定义之基本表的定义/创建、修改和删除
前言 🚩定义/创建基本表语法示例 修改基本表语法示例 删除基本表语法示例 感谢 💖 前言 🚩 SQL支持数据库系统的三级模式结构,其模式、外模式和内模式中的基本对象有表、视图和索引,因此,SQL的数据定义功能…...
面试算法22:链表中环的入口节点(1)
题目 如果一个链表中包含环,那么应该如何找出环的入口节点?从链表的头节点开始顺着next指针方向进入环的第1个节点为环的入口节点。 例如,在如图4.3所示的链表中,环的入口节点是节点3。 分析 第1步:确认是否包含环…...
蓝桥杯---第二讲---二分与前缀和
文章目录 前言Ⅰ. 数的范围0x00 算法思路0x00 代码书写 Ⅱ. 数的三次方根0x00 算法思路0x01代码书写 Ⅲ. 前缀和0x00 算法思路0x01 代码书写 Ⅳ. 子矩阵的和0x00 算法思路0x01 代码书写 Ⅴ. 机器人跳跃问题0x00 算法思路0x01 代码书写 Ⅵ. 四平方和0x00 算法思路0x01 代码书写 …...
d3dx9_39.dll如何修复?最新修复d3dx9_39.dll方法分享
大家好!今天我要和大家分享的主题是“d3dx9_39.dll丢失的修复方法”。我们都知道,在使用电脑的过程中,经常会遇到各种问题,而其中最常见的就是文件丢失。d3dx9_39.dll就是其中一个常见的丢失文件。那么,如何修复这个丢…...
阿里云轻量应用服务器月流量限制说明(部分套餐不限流量)
阿里云轻量应用服务器部分套餐限制月流量,轻量应用服务器按照套餐售卖,有的套餐限制月流量,有的不限制流量。像阿里云轻量2核2G3M带宽轻量服务器一年108元和轻量2核4G4M带宽一年297.98元12个月,这两款是不限制月流量的。阿里云百科…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
