C# 实现websocket双向通信

在这里插入图片描述

🎈个人主页:靓仔很忙i
💻B 站主页:👉B站👈
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:C#
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!


本文基于WebSocketSharp实现了websocket双向通信,除基本的客户端向服务端发送消息外,也支持客户端向指定的客户端发送消息、群发消息,其他协议可自定义。废话不多说,直接上干货。

一.服务端

新建一个.net项目,如websocket.server

  1. 安装包
Install-Package WebSocketSharp -Pre
  1. 定义WebSocketHelper
using CaseAuto.helper.websocket;
using System.Collections.Generic;
using WebSocketSharp.Server;namespace CaseAuto.helper
{public class WebSocketHelper{static WebSocketServer wssv = new WebSocketServer("ws://127.0.0.1");private static Dictionary<string,CaseInfoBehavior> clients = new Dictionary<string,CaseInfoBehavior>();public static void Init(){wssv.AddWebSocketService<CaseInfoBehavior>("/caseInfo",()=>new CaseInfoBehavior(clients));wssv.Start();}public static void End(){wssv.Stop();}}
}
  1. 创建CaseInfoBehavior
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using WebSocketSharp;
using WebSocketSharp.Server;namespace CaseAuto.helper.websocket
{public class CaseInfoBehavior : WebSocketBehavior{private string _username;private Dictionary<string, CaseInfoBehavior> _clients = new Dictionary<string, CaseInfoBehavior>();public CaseInfoBehavior(Dictionary<string,CaseInfoBehavior> clients){_clients = clients;}protected override void OnMessage(MessageEventArgs e){var data=JsonConvert.DeserializeObject<WebSocketMsgModel>(e.Data);switch (data.msgType){case MsgType.NORMAL:var msg = $"This msg from serve,I recive msg:{data.content}";Send(msg);break;case MsgType.GROUP:SendMessageToAll(data.content);//Sessions.Broadcast(data.content);break;case MsgType.TO_RECIVER:SendMessageToReciver(data.reciver, data.content);break;default:break;}}protected override void OnOpen(){_username = Context.QueryString["name"];if (string.IsNullOrEmpty(_username)){_username = this.ID;return;}_clients.Add(_username, this);Console.WriteLine("Client connected: " + _username);}protected override void OnClose(CloseEventArgs e){_clients.Remove(_username);Console.WriteLine("Client connected: " + _username);}protected void SendMessageToReciver(string reciver,string message){foreach (var client in _clients){if (client.Key == reciver) { client.Value.Send(message);break;}}}protected void SendMessageToAll(string message){foreach (var client in _clients){client.Value.Send(message);}}}
}
  1. 创建WebSocketMsgModel
namespace CaseAuto.helper.websocket
{public class WebSocketMsgModel{public MsgType msgType { get; set; }public string content{ get; set; }public string sender { get; set; }public string reciver { get; set; }}public enum MsgType { NORMAL=0,GROUP=1,TO_RECIVER = 2,}
}
  1. 使用
WebSocketHelper.Init();

二.客户端

新建一个.net项目,如websocket.client

  1. 安装包
Install-Package WebSocketSharp -Pre
  1. 使用
        static void Main(string[] args){using (var ws = new WebSocket("ws://127.0.0.1/caseInfo?name=c1")){string? response = string.Empty;ws.OnMessage += (sender, e) =>{response = e.Data;Console.WriteLine("Response: " + response);};ws.Connect();while (true){string? request = Console.ReadLine();ws.Send(request);Console.ReadKey(true);}}}

三.调试

  1. 启动分别启动服务端、客户端
  2. 客户端控制台输入【常规通讯测试】
{"msgType":0,"content":"hello"}

输入后,回车,服务端返回
在这里插入图片描述

  1. 启动apipost,新建websocket,输入以下内容【群发】
ws://127.0.0.1/caseInfo?name=c2
{"msgType":1,"content":"hello456","reciver":"c1"}

在这里插入图片描述
点击连接:
在这里插入图片描述

点击发送:
在这里插入图片描述
在这里插入图片描述
4. 指定人发送
将apipost中发送的消息变为下面内容,重新观察apipost和自定义客户端

{"msgType":2,"content":"hello c1","reciver":"c1"}

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

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

相关文章

人工智能在多模态多组学领域的最新研究进展|顶刊速递·24-06-29

小罗碎碎念 本期推文主题&#xff1a;人工智能在多模态与多组学中的最新研究进展 今天这期推文比较特殊&#xff0c;起来就开始干活&#xff0c;只能跑来会场写了。 小罗观点 今天这期推文覆盖面挺广的&#xff0c;前四篇与肿瘤治疗相关&#xff0c;并且两篇都直接与免疫微环境…

Websocket解析及用法(封装一个通用订阅发布主题的webSocket类)

1、什么是WebSocket? websocket的目标是通过一个长连接实现与服务器全双工&#xff0c;双向的通信。是一种在单个TCP连接上进行全双工通信的协议&#xff0c;使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在 js中创建websocket…

基于Embedding实现超越ES的高级搜索

目前&#xff0c;很多企业会利用大模型来做企业内部知识库系统&#xff0c;比如智能客服系统&#xff0c;做法是把企业内部的整理的产品手册、常见问题手册&#xff0c;做成智能知识库系统&#xff0c;客户可以直接向知识库系统用自然语言提问&#xff0c;知识库系统能理解客户…

统计信号处理基础 习题解答11-1

题目 观测到的数据具有PDF 在μ给定的条件下&#xff0c;是相互独立的。均值具有先验PDF&#xff1a; 求μ的 MMSE 和 MAP 估计量。另外&#xff0c;当和时将发生什么情况? 解答 和两者都是独立高斯分布&#xff0c;与例题10.1一致&#xff0c;直接套用&#xff08;10.11&am…

Nvidia Jetson/RK3588+AI双目立体相机,适合各种割草机器人、扫地机器人、AGV等应用

双目立体视觉是基于视差原理&#xff0c;依据成像设备从不同位置获取的被测物体的图像&#xff0c;匹配对应点的位置偏移&#xff0c;得到视差数据&#xff0c;进而计算物体的空间三维信息。为您带来高图像质量的双目立体相机&#xff0c;具有高分辨率、低功耗、远距离等优点&a…

ubuntu丢失网络/网卡的一种原因解决方案

现象 开机进入ubuntu后发现没有网络&#xff0c;无论是在桌面顶部状态栏的快捷键 还是 系统设置中&#xff0c;都没有”有线网“和”无线网“的选项&#xff0c;”代理“的选项是有的使用数据线连接电脑和手机&#xff0c;手机开启”通过usb共享网络“&#xff0c;还是没有任何…

【python】scikit-learn安装失败No matching distribution found for scikit-learn

报错如下&#xff1a; (yolo) xiaoxinxiaoxin:~/Documents/PaDiM-Anomaly-Detection-Localization-master-main$ pip install scikit-learn ERROR: Could not find a version that satisfies the requirement scikit-learn (from versions: none) ERROR: No matching distribu…

Nginx 1.26.1最新版部署笔记

Nginx是一个高性能的 HTTP 和反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。 以下是 Nginx 的一些核心功能和特点&#xff1a; 高性能的 Web 服务器&#xff1a; Nginx 被设计为处理高并发连接&#xff0c;具有非常高的性能和稳定性。反向代理&#xff1a; …

Text2SQL中反思纠错的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

二叉树之深度优先((Depth-First Search, DFS)

产生背景 深度优先搜索(Depth-First Search, DFS)算法的产生背景主要有以下几个方面: 图论研究 图论是计算机科学和数学中一个重要的分支,涉及对图形结构的分析和研究。早期的图论研究者,如欧拉和 Tarjan,就提出了一些基于深度优先的图遍历策略。这些工作奠定了深度优先搜索…

分享3个AI工具-包括自学AI文档和AI搜索和智能体

文章目录 通往AGI之路-自学神器秘塔AI扣子 通往AGI之路-自学神器 这是是一个有关AI知识的开源文档。 但是&#xff0c;我认为这是小白学习AI的最强王者&#xff0c;每一个想学习AI、想使用AI的人都可以把它设为首页&#xff0c;从它开始。 飞书文档&#xff1a;通往AGI之路 …

Python 面试【★★★★】

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

golang跨平台GUI框架fyne介绍与使用详解,开放案例

golang跨平台GUI框架fyne介绍与使用详解 Fyne 是一个使用 Go 编写的易于使用的 UI 工具包和应用程序 API。 它旨在构建使用单一代码库在桌面和移动设备上运行的应用程序。 通过批量调用身份证实名和三网手机实名和银行卡核验等接口&#xff0c;完成fyne框架的基本使用介绍 主要…

CVPR 2024 | 双手协作双物体的数据集TACO:引领可泛化手物交互的新方向

论文题目&#xff1a; TACO: Benchmarking Generalizable Bimanual Tool-ACtion-Object Understanding 论文链接&#xff1a; https://arxiv.org/pdf/2401.08399.pdf 项目主页&#xff1a; https://taco2024.github.io/ 视频链接&#xff1a; https://www.youtube.com/watch…

完全离线的本地问答模型LocalGPT如何实现无公网IP远程连接提问

文章目录 前言环境准备1. localGPT部署2. 启动和使用3. 安装cpolar 内网穿透4. 创建公网地址5. 公网地址访问6. 固定公网地址 前言 本文主要介绍如何本地部署LocalGPT并实现远程访问&#xff0c;由于localGPT只能通过本地局域网IP地址端口号的形式访问&#xff0c;实现远程访问…

技术驱动的音乐变革:AI带来的产业重塑

&#x1f4d1;引言 近一个月来&#xff0c;随着几款音乐大模型的轮番上线&#xff0c;AI在音乐产业的角色迅速扩大。这些模型不仅将音乐创作的门槛降至前所未有的低点&#xff0c;还引发了一场关于AI是否会彻底颠覆音乐行业的激烈讨论。从初期的兴奋到现在的理性审视&#xff0…

石家庄高校大学智能制造实验室数字孪生可视化系统平台项目验收

智能制造作为未来制造业的发展方向&#xff0c;已成为各国竞相发展的重点领域。石家庄高校大学智能制造实验室积极响应国家发展战略&#xff0c;结合自身优势&#xff0c;决定引进数字孪生技术&#xff0c;构建一个集教学、科研、生产于一体的可视化系统平台。 数字孪生可视化…

Trie字符串统计

Trie字符串统计 维护一个字符串集合&#xff0c;支持两种操作&#xff1a; I x 向集合中插入一个字符串 x&#xff1b;Q x 询问一个字符串在集合中出现了多少次。 共有 N个操作&#xff0c;所有输入的字符串总长度不超过 105&#xff0c;字符串仅包含小写英文字母。 输入格式…

launch 中可执行文件 type

<node pkg"waypoint_generator" name"waypoint_generator" type"waypoint_generator_ms" output"screen">pkg 指定了包名&#xff0c;它告诉 ROS 应该在哪个包中查找可执行文件。 name 指定了节点名&#xff0c;这个名称在 ROS …

Java中的Path类使用详解及最佳实践

Java中的Path类使用详解及最佳实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Java中的Path类&#xff0c;这是Java标准库中用于操作文件…