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.mfbz.cn/a/755565.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于新零售的一些思考

本文作为2024上半年大量输入之后的核心思考之一。工作到一定阶段之后&#xff0c;思考的重要性越来越高&#xff0c;后续会把自己的个人思考记录在这个新系列《施展爱思考》。背景是上半年面临业务转型从电商到新零售&#xff0c;本文是相关大量输入之后的思考&#xff0c;对新…

还在用 Jenkins?快来试试这款简而轻的自动化部署工具吧!

文章目录 项目介绍功能特性效果展示逻辑节点仓库信息构建列表SSH 管理 安装使用一键安装命令管理 Jpom 服务端防火墙配置 相关地址总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#x…

Altium Designer的元件库 PCB库 3D库神器

元件库 PCB库 3D库神器 对于硬件工程师来说贸泽是一个器件选型相当方便的电子商城,虽然购买元器件比立创商城要慢和贵,但是,上面的物料种类、选型的便捷性要远远好于立创商城;而且,它上面的大多数元件都有自己的元件封装、PCB封装、3D模型,这就对实际的开发节省了好多绘…

LangChain E-Mails with LLM

题意&#xff1a;通过LangChain使用大型语言模型&#xff08;LLM&#xff09;处理电子邮件 问题背景&#xff1a; I am quite new to LangChain and Python as im mainly doing C# but i am interested in using AI on my own data. So i wrote some python code using langch…

springboot系列八: springboot静态资源访问,Rest风格请求处理, 接收参数相关注解

文章目录 WEB开发-静态资源访问官方文档基本介绍快速入门注意事项和细节 Rest风格请求处理基本介绍应用实例注意事项和细节思考题 接收参数相关注解基本介绍应用实例PathVariableRequestHeaderRequestParamCookieValueRequestBodyRequestAttributeSessionAttribute ⬅️ 上一篇…

智慧校园-医务管理系统总体概述

智慧校园医务管理系统&#xff0c;作为校园健康管理体系的智能化升级&#xff0c;深度融合信息技术与医疗服务&#xff0c;为师生构筑起一道全方位的健康守护网。医务管理系统以提升校园医疗服务水平、优化健康管理流程为核心目标&#xff0c;通过一系列创新功能&#xff0c;确…

SerDes介绍以及原语使用介绍(2)OSERDESE2原语仿真

文章目录 前言一、SDR模式1.1、设计代码1.2、testbench代码1.3、仿真分析 二、DDR模式下2.1、设计代码2.2、testbench代码2.3、仿真分析 三、OSERDES2级联3.1、设计代码3.2、testbench代码3.3、代码分析 前言 上文通过xilinx ug471手册对OSERDESE有了简单的了解&#xff0c;接…

Rabbit MQ安装详细记录

RabbitMQ是Erlang语言开发的&#xff0c;因此安装Erlang环境在进行安装RbbitMQ的操作&#xff0c;选择两者版本时一定要参考版本的兼容性。 查看RabbitMQ和Erlang版本对应关系&#xff1a;https://www.rabbitmq.com/which-erlang.html 一、下载地址 下载Erlang地址 : https:…

【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型)

【RT摩拳擦掌】RT云端测试之百度天工物接入构建&#xff08;设备型&#xff09; 一&#xff0c; 文档介绍二&#xff0c; 物接入IOT Hub物影子构建2.1 创建设备型项目2.2 创建物模型2.3 创建物影子 三&#xff0c; MQTT fx客户端连接云端3.1 MQTT fx配置3.2 MQTT fx订阅3.3 MQT…

SpringBoot学习05-[SpringBoot的嵌入式Servlet容器]

SpringBoot的嵌入式Servlet容器 嵌入式Servlet容器servlet容器-嵌入式servlet容器配置修改通过全局配置文件修改修改添加实现了WebServerFactoryCustomizer接口的bean来进行修改 servlet容器-注册servlet三大组件 嵌入式Servlet容器 SpringBoot包含对嵌入式Tomcat、Jetty、Und…

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

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

DIYGW UniApp低代码可视化平台:高效、灵活、安全的应用开发新途径

一、引言 在数字化快速发展的今天&#xff0c;企业对于快速构建多端应用的需求日益增长。然而&#xff0c;传统的应用开发方式往往面临周期长、成本高、技术门槛高等问题。为了解决这些问题&#xff0c;DIYGW UniApp低代码可视化平台应运而生&#xff0c;它以高效率、多端使用…

动态人物抠图换背景 MediaPipe

pip下载 MediaPipe pip install mediapipe -i 手部特征点模型包包含一个手掌检测模型和一个手部特征点检测模型。手掌检测模型在输入图片中定位手部&#xff0c;手部特征点检测模型可识别手掌检测模型定义的被剪裁手掌图片上的特定手部特征点。 由于运行手掌检测模型非常耗时&…

面试突击:HashMap 源码详解

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 数据结构 JDK1.8 之前 JDK1.8 之前 HashMap 采用 数组和链表 结合的数据结构。如下图&#xff1a; HashMap 将 key 的 hashCode 经过扰动函数处理过后得到 hash 值&#…

用C/C++写一个客户端和服务器之间进行TCP通信的DEMO

目录 一、Visual Sudio 2022 二、配置 三、说明 四、客户端 五、服务端 六、演示 一、Visual Sudio 2022 Visual Studio 2022是微软公司推出的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在为开发人员提供全面的工具集&#xff0c;支持从Windows到MacOS…

【算法专题--链表】两数相加 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐双指针 -- 模拟进位 (使用哨兵位头节点) &#x1f95d; 什么是哨兵位头节点&#xff1f; &#x1f347;思路解析 &#x1f34d;案例图解 四、总结与提炼 五、共勉 一、前言 两数相加 这道题&#xff0c;可以说是--…

Linux Swap

Swap: 页面换出&#xff1a;就是在 Swap 机制下&#xff0c;当内存资源紧张时&#xff0c;内核就会把不经常使用的这些匿名页中的数据写入到 Swap 分区或者 Swap 文件中。从而释放这些数据所占用的内存空间。 页面换入&#xff1a;就是当进程再次访问那些被换出的数据时&…

如何修复Power BI【View usage metrics report】指标报表数据源更新问题?

故事背景 有朋友留言询问&#xff1a;通过我之前写的 想知道Power BI用户访问报告的次数&#xff1f;快来学习&#xff01; 这篇文章&#xff0c;了解了如何查看Power BI用户访问报告的详情。 但是最近由于创建【View usage metrics report】指标报表的小伙伴离职了&#x…

【数据可视化技术】1、如何使用Matplotlib和Seaborn库在Python中绘制热力图

热力图是一种数据可视化技术&#xff0c;可以显示变量之间的相关性。这个代码段是数据分析和可视化的常用方法&#xff0c;特别适合于展示变量之间的相关性&#xff0c;对于数据科学和机器学习项目非常有帮助。 1、 导入必要的库 首先&#xff0c;确保你已经安装了matplotlib…

苏州网站建设好做吗

苏州网站建设是一个非常热门的行业&#xff0c;由于苏州地理位置优越、经济发达、人口众多&#xff0c;所以网站建设市场也非常火爆。但是在苏州网站建设这个行业中&#xff0c;竞争也是非常激烈的&#xff0c;所以想要在这个市场中脱颖而出并不是件容易的事情。 首先&#xff…