.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个月,这两款是不限制月流量的。阿里云百科…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...
13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...