当前位置: 首页 > news >正文

成都门户网站建设/江门网站定制多少钱

成都门户网站建设,江门网站定制多少钱,百度爱采购登录入口,网站开发上市公司1. 创建Socket实例并开启。 private int OpenTcp(int port, string ip "") {//1. 开启服务端try{_tcpServer new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ipAddr IPAddress.Any;if (ip ! "" && i…

1. 创建Socket实例并开启。

private int OpenTcp(int port, string ip = "")
{//1. 开启服务端try{_tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ipAddr = IPAddress.Any;if (ip != "" && ip != string.Empty){ipAddr = IPAddress.Parse(ip);}_tcpServer.Bind(new IPEndPoint(ipAddr, port));_tcpServer.Listen();_isListening = true;//开启线程Thread listenThread = new Thread(new ThreadStart(AcceptClients));listenThread.Start();}catch (Exception ex){Log.Instance.Error("TcpServer setup fail!\n" + CommonMsg.Space + ex.Message);}return 0;
}

2. 客户端连接——AcceptClients实现。

private void AcceptClients()
{while (_isListening){//单客户端_tcpSocket = _tcpServer.Accept();if (_tcpSocket != null){Thread clientThread = new Thread(SocketReceive);clientThread.Start(_tcpSocket);Log.Instance.Info($"Socket connected!  ( {_tcpSocket.LocalEndPoint} )");}Thread.Sleep(300);}
}

3. 接收客户端信息——SocketReceive实现。

(仅仅将接收的数据放到队列中,不加处理,否则可能耗时而影响通讯接收)

private void SocketReceive(object? obj)
{Socket? tcpClient = (Socket?)obj;if (tcpClient == null) return;//以下代码不放入线程中while (true){if (tcpClient.Connected){int available = tcpClient.Available;if (available > 0){byte[] buffer = new byte[available];int dataSize = tcpClient.Receive(buffer);if (dataSize != available) { MessageBox.Show("Socket received data not equal to available data"); break; }_queueMsgRecv.Enqueue(buffer);}}Thread.Sleep(5);}tcpClient.Close();
}

4. 开启数据处理线程——OpenMsgParseThread

(不断从接收队列中取数据,根据通讯协议进行解析,并处理)

private void OpenMsgParseThread()      
{Task.Run(() =>{while (true){while (_queueMsgRecv.TryDequeue(out byte[]? buffer)){if (buffer != null && buffer.Length > 0){//查询list 中是否存在结束符while (true){List<byte> bufList = buffer.ToList();int flagIdx = bufList.IndexOf(0x04);if (flagIdx == -1){//不存在结束符_msgValid += Encoding.UTF8.GetString(buffer);break;}else{//存在结束符_msgValid += Encoding.UTF8.GetString(buffer.Take(flagIdx).ToArray());buffer = buffer.Skip(flagIdx + 1).Take(buffer.Length - flagIdx - 1).ToArray();try{JObject jObj = JObject.Parse(_msgValid);  //这个地方 如果发来的数据格式有问题,或者不完整,解析会出现异常ProcessRecvMsg(jObj);}catch (Exception ex){Log.Instance.Error("Msg: " + _msgValid);_msgValid = "";byte[] data = LeadlapTool.CreateComnData(MsgToken.TcpDataParseException, null, false, ex.Message);SendMsg(data);continue;}_msgValid = "";continue;}}}}Thread.Sleep(5);}});
}

5. 开启数据发送线程——OpenMsgSendThread

(不断从发送队列取数据,执行发送)

private void OpenMsgSendThread()
{Task.Run(() =>{while (true){if (_tcpSocket.Connected){lock (_locker){bool ret = _queueMsgSend.TryDequeue(out byte[]? data);if (ret && data != null){_tcpSocket.Send(data);}}}Thread.Sleep(10);}});
}

6. 在需要发送数据处执行发送操作——SendMsg

lock (_locker)
{_queueMsgSend.Enqueue(data);
}

7. 关于数据解析

通常需要约定好帧头、帧尾,防止数据丢包、粘包情况。

(1)描述:数据为 byte[],以 0x04 为结束符。

(2)分析:如果数据发送由于阻塞,导致粘包;或者如果发送数据量过大,分好几次才接收完整,导致拆包;

(3)解决:粘包——对数据包解析识别结束符 0x04 并分割,分别解析。

拆包——对数据包叠加,直至识别到结束符 0x04,整合后解析。

(4)数据类型转换。

0x04 作为 byte比较。用 List 的 IndexOf 函数判断,若是-1,则不存在;否则返回 序号。

byte[] --> List: buffer.ToList();

List --> byte[]: bufList.ToArray();

byte[] --> string: Encoding.UTF8.GetString(buffer);

string --> byte[]: Encoding.UTF8.GetBytes(msg);

buffer.Take(flagIdx).ToArray();

相关文章:

C++Socket通讯样例(服务端)

1. 创建Socket实例并开启。 private int OpenTcp(int port, string ip "") {//1. 开启服务端try{_tcpServer new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ipAddr IPAddress.Any;if (ip ! "" && i…...

【学术会议论文投稿】大数据治理:解锁数据价值,引领未来创新

第六届国际科技创新学术交流大会&#xff08;IAECST 2024&#xff09;_艾思科蓝_学术一站式服务平台 更多学术会议请看&#xff1a;https://ais.cn/u/nuyAF3 目录 引言 一、大数据治理的定义 二、大数据治理的重要性 三、大数据治理的核心组件 四、大数据治理的实践案例…...

location中href和replace的区别

1.有两种方式&#xff1a; a、使用 location.href&#xff1a;window.location.href“success.html”; b、使用location.replace&#xff1a;window.location.replace(“new_file.html”); 2.区别是什么&#xff1f; 结果&#xff1a;href相当于打开一个新页面&#xff0c;…...

基于Spring Boot的在线摄影工作室开发指南

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理网上摄影工作室的相关信息成为必然。开发合…...

JDK源码系列(五)—— ConcurrentHashMap + CAS 原理解析

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 ConcurrentHashMap 类 ConcurrentHashMap 1.7 在JDK1.7中ConcurrentHashMap采用了数组分段锁的方式实现。 Segment(分段锁)-减少锁的粒度 ConcurrentHashMap中的分段锁称为Segment&#xff0c;它即类似于…...

技术成神之路:二十三种设计模式(导航页)

设计原则/模式链接面向对象的六大设计原则技术成神之路&#xff1a;面向对象的六大设计原则创建型模式单例模式建造者模式原型模式工厂方法模式抽象工厂模式行为型模式策略模式状态模式责任链模式观察者模式备忘录模式迭代器模式模板方法模式访问者模式中介者模式命令模式解释器…...

Rust编程与项目实战-元组

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 8.2.1 元组的定义 元组是Rust的内置复合数据类型。Rust支持元组&#xff0c;而且元…...

容性串扰和感性串扰

串扰根源在于耦合&#xff0c;电场耦合产生容性耦合电流&#xff0c;磁场耦合产生感性耦合电流 关于容性后向串扰电压与后向串扰系数推导...

windows Terminal 闪退 -- 捣蛋砖家

最近点击Windows 终端总是闪退。 日志提示: 错误应用程序名称: WindowsTerminal.exe&#xff0c;版本: 1.21.2410.17001&#xff0c;时间戳: 0x67118f02 错误模块名称: ucrtbase.dll&#xff0c;版本: 10.0.22621.3593&#xff0c;时间戳: 0x10c46e71 异常代码: 0xc0000409 错…...

java-web-day5

1.spring-boot-web入门 目标: 开始最基本的web应用的构建 使用浏览器访问后端, 后端给浏览器返回HelloController 流程: 1.创建springboot工程, 填写模块信息, 并勾选web开发的相关依赖 注意: 在新版idea中模块创建时java下拉框只能选17, 21, 23 这里选17, maven版本是3.6.3, 很…...

Python | Leetcode Python题解之第508题出现次数最多的子树元素和

题目&#xff1a; 题解&#xff1a; class Solution:def findFrequentTreeSum(self, root: TreeNode) -> List[int]:cnt Counter()def dfs(node: TreeNode) -> int:if node is None:return 0sum node.val dfs(node.left) dfs(node.right)cnt[sum] 1return sumdfs(r…...

Java 分布式缓存

在当今的大规模分布式系统中&#xff0c;缓存技术扮演着至关重要的角色。Java 作为一种广泛应用的编程语言&#xff0c;拥有丰富的工具和框架来实现分布式缓存。本文将深入探讨 Java 分布式缓存的概念、优势、常见技术以及实际应用案例&#xff0c;帮助读者更好地理解和应用这一…...

【MySQL】MySQL 使用全教程

MySQL 使用全教程 介绍 MySQL 是一种广泛使用的开源关系型数据库管理系统(Relational Database Management System)&#xff0c;它基于 Structured Query Language&#xff08;SQL&#xff09;进行数据管理&#xff0c;允许用户存储、检索、更新和删除数据库中的数据。通过提供…...

油猴脚本-GPT问题导航侧边栏增强版

为 GPT官网和相关网站提供了一个便捷的侧边栏目录&#xff0c;能够自动搜集当前会话页面的问题&#xff0c;展示在侧边栏上&#xff0c;可快速导航到问题的位置。 安装使用地址:https://scriptcat.org/zh-CN/script-show-page/1972 安装前请确保浏览器有油猴&#xff0c;没有…...

Java Lock ConditionObject 总结

前言 相关系列 《Java & Lock & 目录》&#xff08;持续更新&#xff09;《Java & Lock & ConditionObject & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Java & Lock & ConditionObject & 总结》&#xff08;学习…...

模块化主动隔振系统市场规模:2023年全球市场规模大约为220.54百万美元

模块化主动隔振系统是一种用于精密设备和实验装置的隔振解决方案&#xff0c;通过主动控制技术消除振动干扰&#xff0c;提供稳定的环境。目前&#xff0c;随着微纳制造和精密测量技术的发展&#xff0c;对隔振系统的要求越来越高。模块化设计使得系统能够灵活适应不同负载和工…...

SpringAOP:对于同一个切入点,不同切面不同通知的执行顺序

目录 1. 问题描述2. 结论结论1&#xff1a;"对于同一个切入点&#xff0c;同一个切面不同类型的通知的执行顺序"结论2&#xff1a;"对于同一个切入点&#xff0c;不同切面不同类型通知的执行顺序" 3. 测试环境&#xff1a;SpringBoot 2.3.4.RELEASE测试集合…...

unique_ptr初始化

std::unique_ptr 是 C11 引入的智能指针&#xff0c;用于管理动态分配的对象的生命周期。unique_ptr 确保每个动态分配的对象有且仅有一个所有者&#xff0c;当 unique_ptr 超出作用域时&#xff0c;它会自动释放其管理的对象。以下是 std::unique_ptr 的一些常见初始化方法。 …...

HelloCTF [RCE-labs] Level 8 - 文件描述和重定向

开启靶场&#xff0c;打开链接&#xff1a; GET传参cmd system($cmd.">/dev/null 2>&1"); 这行代码将执行命令 $cmd&#xff0c;并且将其标准输出和标准错误输出都重定向到 /dev/null&#xff0c;这意味着无论命令的输出还是可能产生的错误信息都不会显示…...

DEVOPS: 集群伸缩原理

概述 阿里云 K8S 集群的一个重要特性&#xff0c;是集群的节点可以动态的增加或减少有了这个特性&#xff0c;集群才能在计算资源不足的情况下扩容新的节点&#xff0c;同时也可以在资源利用 率降低的时候&#xff0c;释放节点以节省费用理解实现原理&#xff0c;在遇到问题的…...

什么是SMO算法

SMO算法&#xff08;Sequential Minimal Optimization&#xff09; 是一种用于求解 支持向量机&#xff08;SVM&#xff09; 二次规划对偶问题的优化算法。它由 John Platt 在 1998 年提出&#xff0c;目的是快速解决 SVM 的优化问题&#xff0c;特别是当数据集较大时&#xff…...

MySQL根据.idb数据恢复脚本,做成了EXE可执行文件

文章目录 1.代码2.Main方法打包3.Jar包打成exe可执行文件4.使用&#xff08;1.&#xff09;准备一个表结构一样得数据库&#xff08;2.&#xff09;打开软件&#xff08;3.&#xff09;输入路径 5.恢复成功 本文档只是为了留档方便以后工作运维&#xff0c;或者给同事分享文档内…...

Spring Boot面试题

1.什么是SpringBoot&#xff1f;它的主要特点是什么&#xff1f; Spring Boot 是一个基于 Spring 框架的开发和构建应用程序的工具&#xff0c;它旨在简化 Spring 应用的初始搭建和开发过程。Spring Boot 提供了一种约定优于配置的方式&#xff0c;通过自动配置和默认值&#…...

原生页面引入Webpack打包JS

Webpack简介 概述&#xff1a; Webpack是一个现代JavaScript应用程序的静态模块打包器。它将应用程序中的每个文件视为一个模块&#xff0c;并通过配置规则来解析这些模块之间的依赖关系&#xff0c;最终将其打包成一个或多个浏览器可以执行的文件。动态加载&#xff08;Code …...

健康之路押注医药零售:毛利率下滑亏损扩大,医疗咨询人次大幅减少

《港湾商业观察》黄懿 2024年9月13日&#xff0c;健康之路股份有限公司&#xff08;下称“健康之路”&#xff09;再次递表港交所&#xff0c;建银国际为独家保荐人。健康之路国内运营主体为健康之路&#xff08;中国&#xff09;信息技术有限公司和福建健康之路信息技术有限公…...

【人工智能-初级】第7章 聚类算法K-Means:理论讲解与代码示例

文章目录 一、K-Means聚类简介二、K-Means 聚类的工作原理2.1 初始化簇中心2.2 分配簇标签2.3 更新簇中心2.4 迭代重复2.5 K-Means 算法的目标三、K-Means 聚类的优缺点3.1 优点3.2 缺点四、K 值的选择五、Python 实现 K-Means 聚类5.1 导入必要的库5.2 生成数据集并进行可视化…...

HOT 100 技巧题(136/169/75/31/287)

136. 只出现一次的数字 技巧类型题目&#xff0c;通过异或运算实现 169. 多数元素 三种常见解法&#xff1a;1. 哈希2. 排序3. 投票法 75. 颜色分类 单指针 两次遍历&#xff1a;第一次遍历把所有0都交换到前面&#xff0c;记录最后一个0的位置index&#xff0c;第二次遍…...

什么是时间戳?怎么获取?有什么用?

在 JavaScript 中&#xff0c;时间戳通常表示为自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。我们可以使用 Date 对象来获取当前时间的时间戳&#xff0c;或者将特定的日期转换为时间戳。在JavaScript中&#xff0c;时间戳通常以毫秒为单位表示。 如何获取时间戳 在Java…...

LeetCode:459重复的子字符串

给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "aba" 输出: false示例 3: 输入: s "abcabcabcabc" 输…...

【含开题报告+文档+PPT+源码】基于SSM的旅游与自然保护平台开发与实现

开题报告 围场县拥有丰富的自然景观和野生动植物资源&#xff0c;同时面临着旅游业发展和自然保护之间的平衡问题&#xff0c;通过强调自然保护&#xff0c;这个平台可以教育游客如何尊重和保护当地的生态环境。同时&#xff0c;平台还可以提供关于生态保护的信息&#xff0c;…...