C# HPSocket 服务器端的详细 Demo,数据收发打包方式,避免出现沾包的情况

HPSocket 是一款跨平台的 Socket 服务器框架,支持快速开发高性能、高可靠性的网络通信应用程序。它提供了丰富的 API,可以轻松实现客户端与服务器之间的数据收发、连接管理等功能。

代码结构:
1、Program.cs:程序入口,创建 HPSocketServer 实例,启动服务器。
2、HPSocketServer:HPSocket 的服务器端实例,管理连接和通信。

功能实现:

1、接收客户端连接:服务器端循环等待客户端连接请求,创建新的连接实例。
2、接收客户端数据:通过连接实例的 DataArrived事件处理函数接收客户端发送的数据。
3、处理客户端数据:对接收到的数据进行解析和处理。
4、发送响应数据:根据处理结果,向客户端发送响应数据。

性能和安全性优化:
1、异步编程:使用异步编程模型,避免阻塞主线程,提高应用程序的响应性能。
2、数据封装:对发送和接收的数据进行封装,减少网络传输过程中的开销。
3、心跳机制:在服务器端和客户端之间添加心跳机制,保持连接的稳定性。
4、数据加密:对敏感数据进行加密处理,提高数据传输的安全性。

以下是 C# HPSocket 服务器端的详细 Demo:
Program.cs:

using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace HPSocketServerDemo
{class Program{static void Main(string[] args){HPSocketServer server = new HPSocketServer();server.StartListening(12345);}}
}

HPSocketServer.cs:

using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;public class HPSocketServer
{private TcpListener listener;private Thread listenerThread;public void StartListening(int port){try{listener = new TcpListener(IPAddress.Any, port);listener.Start();listenerThread = new Thread(ListenForIncomingRequests);listenerThread.IsBackground = true;listenerThread.Start();Console.WriteLine("服务器启动,等待客户端连接...");}catch (Exception ex){Console.WriteLine($"启动服务器失败:{ex.Message}");}}private void ListenForIncomingRequests(){while (true){try{TcpClient client = listener.AcceptTcpClient();Console.WriteLine("新的客户端连接");// 创建连接实例,并启动数据接收线程HPSocketConnection connection = new HPSocketConnection(client);connection.DataReceived += Connection_DataReceived;connection.StartListening();}catch (Exception ex){Console.WriteLine($"处理客户端连接失败:{ex.Message}");}}}private void Connection_DataReceived(object sender, HPSocketConnectionDataArgs e){byte[] data = e.Data;string received = Encoding.UTF8.GetString(data);Console.WriteLine($"接收到的数据:{received}");// 处理数据,并发送响应string response = ProcessData(received);byte[] responseData = Encoding.UTF8.GetBytes(response);((HPSocketConnection)sender).Send(responseData);}private string ProcessData(string data){// 这里可以根据需要对数据进行处理,并返回响应return $"服务器响应:{data}";}
}class HPSocketConnection
{private TcpClient client;private Thread listenThread;private bool isListening = true;public event DataReceivedEventHandler DataReceived;public HPSocketConnection(TcpClient client){this.client = client;}public void StartListening(){listenThread = new Thread(ListenForData);listenThread.IsBackground = true;listenThread.Start();}private void ListenForData(){try{using (NetworkStream stream = client.GetStream()){byte[] buffer = new byte[1024];while (isListening && client.Connected){int bytesRead = stream.Read(buffer, 0, buffer.Length);if (bytesRead == 0){break;}byte[] data = new byte[bytesRead];Array.Copy(buffer, data, bytesRead);string received = Encoding.UTF8.GetString(data);OnDataReceived(received);}}}catch (Exception ex){Console.WriteLine($"数据接收失败:{ex.Message}");}}protected virtual void OnDataReceived(string data){DataReceivedEventHandler handler = DataReceived;if (handler != null){handler(this, new DataReceivedEventArgs(data));}}public void Send(byte[] data){try{using (NetworkStream stream = client.GetStream()){stream.Write(data, 0, data.Length);}}catch (Exception ex){Console.WriteLine($"发送数据失败:{ex.Message}");}}public void StopListening(){isListening = false;listenThread.Join();}
}public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);public class DataReceivedEventArgs : EventArgs
{public string Data { get; }public DataReceivedEventArgs(string data){Data = data;}
}

在这个示例中,我们创建了一个 HPSocketServer 类,它负责启动 TcpListener 并监听 incoming requests。当一个客户端连接时,它会创建一个新的 HPSocketConnection 实例并启动一个单独的线程来处理该连接。

HPSocketConnection 类负责处理与客户端的通信。它有一个 DataReceived 事件,当接收到数据时会触发。服务器端的数据处理是通过 DataReceived 事件处理器来完成的。数据发送是通过 Send 方法实现的。

为了处理沾包和拆包的问题,我们在 HPSocketConnection 类中使用了一个循环来不断地从网络流中读取数据,直到连接断开或读取到 0 个字节。这样,我们可以确保即使数据跨越了多个网络包,也能够正确地接收到。

在实际应用中,你可能需要根据实际需求对数据包进行更复杂的处理,例如添加长度字段、校验和或使用更高级的协议来确保数据的完整性和可靠性。

请注意,这个示例是一个简单的 HPSocket 服务器实现,它没有实现错误处理、加密或其他安全性措施。在生产环境中,你应该添加适当的错误处理、日志记录、数据加密和其他安全措施来保护你的应用程序。

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

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

相关文章

从零开始,自己搭建一个autonomous mobile robot做gazebo仿真(1):mobile robot建模与添加差速控制器

这样一个简单的mobile robot模型 首先写xacro文件&#xff0c;创建 link joint transmission <?xml version"1.0"?> <robot xmlns:xacro"http://www.ros.org/wiki/xacro" name"whill_modelc" ><xacro:property name"PI&q…

【点云、图像】学习中 常见的数学知识及其中的关系与python实操[更新中]

文章目录 前言一、平均值、方差、协方差平均值&#xff08;mean&#xff09;np.mean()方差&#xff08;variance&#xff09;np.var()总体方差 np.var(a, ddof0)无偏样本方差np.var(a, ddof1)有偏样本方差标准差&#xff08;standard deviation&#xff09;np.std(a, ddof1)默认…

Docker 部署考核

Docker安装 安装必要的系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 添加docker-ce安装源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 配置阿里云Docker Yum源: yum-config-manager --ad…

docker 挂载的文件同步问题 及 telnet redis账号可用

在一台新的服务器上部署docker发现redis服务因白名单没配不通&#xff0c;可以通过telnet来进行测试&#xff0c;包括账号是否可用&#xff1a; 1 telnet 192.168.1.11 6379 # ip port 2 ctrl ] 3 回车 4 键入 auth 111111 # 密码 5 成功 OK 失败 -WRONGPASS invalid us…

UE学习笔记--如何区分FString、FName、FText,以及使用场景

目录 前言FStringFNameFTextFString、FName 和 Text 之间的区别可变性内存开销用例表现本地化支持 结论参考链接 前言 最近在学习 UE&#xff0c;发现 UE 基本没有用到 std::string&#xff0c;基本使用的是FString、FName、FText。去网络上查了些资料并且学习了下&#xff0c…

Numpy中的矩阵运算

一、Matrix和Array Matrix名为矩阵&#xff0c;Array名为阵列&#xff0c;它们都可以作为矩阵运算的结构&#xff0c;功能上Matrix是Array的子集&#xff0c;Matrix运算符相较于Array简单。本文章主要讲解Numpy中的Matrix和Array关于矩阵运算的区别&#xff0c;代码部分已经给出…

Mysql数据库:快速入门

目录 一. 介绍 1. 数据库基础概念 2 MySQL简介 二. 安装与配置 1. 下载与安装 MySQL 2. 配置 MySQL 三. 基本操作 1. 数据库的创建与删除 3 数据操作语言&#xff08;DML&#xff09; 4 数据查询语言&#xff08;DQL&#xff09; 5 数据控制语言&#xff08;DCL&…

年终总结:我的2023编程之旅

1. 成果回顾 在这一年中&#xff0c;我成功地完成了多个项目&#xff0c;其中最重要的是我们团队开发的“智能数据分析平台”。我负责了后端开发的核心部分&#xff0c;该平台目前每天处理超过100万条数据&#xff0c;为我们的客户提供了宝贵的信息和建议。同时&#xff0c;我…

2024.1.19 网络编程 作业

思维导图 练习题 1> UDP传输实现聊天室 服务器端 #include <myhead.h> #define SER_IP "192.168.125.151" #define SER_PORT 9999 typedef struct Msg {char user[32]; //用户名int type; //执行操作1.登录、2.发消息、0.退出char text[1024]; …

【Flink-CDC】Flink CDC 介绍和原理概述

【Flink-CDC】Flink CDC 介绍和原理概述 1&#xff09;基于查询的 CDC 和基于日志的 CDC2&#xff09;Flink CDC3&#xff09;Flink CDC原理简述4&#xff09;基于 Flink SQL CDC 的数据同步方案实践4.1.案例 1 : Flink SQL CDC JDBC Connector4.2.案例 2 : CDC Streaming ETL…

在 Python 中检查一个数字是否是同构数

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 同构数&#xff0c;又称为自守数或自同构数&#xff0c;是一类特殊的数字&#xff0c;它们具有一种有趣的性质&#xff1a;将其平方后的数字&#xff0c;可以通过某种方式重新排列得到原来的数字。本文将详细介绍…

Java读取制表符文本转换为JSON

在Java开发中&#xff0c;处理各种数据格式是常见的任务。本文将介绍如何使用Java读取制表符文本文件&#xff0c;并将其转换为JSON格式&#xff0c;以便于后续的数据处理和分析。我们将使用Java中的相关库来实现这个过程&#xff0c;并提供详细的代码示例。 引言&#xff1a;…

4654. 消除游戏

4654. 消除游戏 - AcWing题库 #include <iostream> #include <vector> #include <cstring> using namespace std;const int N 1e6 10; char s[N]; int l[N], r[N]; vector<int> v, p; bool st[N]; void ins(int i) {if (st[i]) return;st[i] true;…

2024Java高频面试题之MQ消息中间件,面试都问些什么?(附详细答案)

最近很多同学问我有没有java学习资料&#xff0c;我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我公众号&#xff1a;“ Tom聊架构 ”&#xff0c; 回复暗号&#xff1a;“ 578”即…

Dockerfile镜像构建

Dockerfile镜像构建 1、部署harbor仓库 #部署docker #解压harbor安装包 rootharbor:~# cd /app/harbor/ rootharbor:/app/harbor# ll total 597560 drwxr-xr-x 3 root root 180 Jan 13 13:17 ./ drwxr-xr-x 4 root root 77 Jan 13 13:14 ../ drwxr-xr-x 3 root …

element-ui 打包流程源码解析(下)

目录 目录结构和使用1&#xff0c;npm 安装1.1&#xff0c;完整引入1.2&#xff0c;按需引入 2&#xff0c;CDN3&#xff0c;国际化 接上文&#xff1a;element-ui 打包流程源码解析&#xff08;上&#xff09; 文章中提到的【上文】都指它 ↑ 目录结构和使用 我们从使用方式来…

零基础学Python(3)— 注释、代码缩进和编码规范

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在使用Python语言进行编程的时候&#xff0c;需要遵循一定的规范标准。本节课就带大家了解下Python语言在注释、缩进和编码方面的规范!~&#x1f308; 目录 &#x1f680;1.注释 &#x1f680;2.代码缩进 &#x1f68…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉导航

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 VX关注&#xff0c;并留下邮箱可获得每日定时推送 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航具身智能&#xff0c;机器人强化…

网络爬虫原理介绍

网络爬虫是一种按照一定规则自动浏览、检索网页信息的程序或者脚本。它能够自动请求网页&#xff0c;并将所需要的数据抓取下来。通过对抓取的数据进行处理&#xff0c;从而提取出有价值的信息。 Python 爬虫是指用 Python 语言编写的网络爬虫程序。Python 爬虫几乎成了网络爬…

Mysql三种常用的删除方式

前言 在 MySQL 中&#xff0c;有三种常用的方式可以删除表中的数据或整个表&#xff0c;它们分别是 TRUNCATE、DROP 和 DELETE。 TRUNCATE TABLE TRUNCATE TABLE属于DDL语言&#xff0c;不走事务&#xff0c;数据不会回滚 TRUNCATE TABLE 语句会删除表中的所有数据&#xff…