C#写一个WebService服务器

首先在NuGet中下载Fleck动态库

创建一个WebSocketHelper类

public class WebSocketHelper
{//客户端url以及其对应的Socket对象字典IDictionary<string, IWebSocketConnection> dic_Sockets = new Dictionary<string, IWebSocketConnection>();//创建一个 websocket ,0.0.0.0 为监听所有的的地址WebSocketServer server = new WebSocketServer("ws://127.0.0.1:50000");//打开连接委托public delegate void _OnOpen(string ip);public event _OnOpen OnOpen;//关闭连接委托public delegate void _OnClose(string ip);public event _OnClose OnClose;//当收到消息public delegate void _OnMessage(string ip, string msg);public event _OnMessage OnMessage;/// <summary>/// 初始化/// </summary>private void Init(){//出错后进行重启server.RestartAfterListenError = true;//开始监听server.Start(socket =>{//连接建立事件socket.OnOpen = () =>{//获取客户端网页的urlstring clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;dic_Sockets.Add(clientUrl, socket);if (OnOpen != null) OnOpen(clientUrl);Console.WriteLine(DateTime.Now.ToString() + " | 服务器:和客户端:" + clientUrl + " 建立WebSock连接!");};//连接关闭事件socket.OnClose = () =>{string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;//如果存在这个客户端,那么对这个socket进行移除if (dic_Sockets.ContainsKey(clientUrl)){dic_Sockets.Remove(clientUrl);if (OnClose != null) OnClose(clientUrl);}Console.WriteLine(DateTime.Now.ToString() + " | 服务器:和客户端:" + clientUrl + " 断开WebSock连接!");};//接受客户端网页消息事件socket.OnMessage = message =>{string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;Receive(clientUrl, message);if (OnMessage != null)OnMessage(clientUrl, message);};});}/// <summary>/// 向客户端发送消息/// </summary>/// <param name="webSocketConnection">客户端实例</param>/// <param name="message">消息内容</param>public void Send(string clientUrl, string message){IWebSocketConnection webSocketConnection = GetUserSocketInstance(clientUrl);if (webSocketConnection != null){if (webSocketConnection.IsAvailable){webSocketConnection.Send(message);}}}/// <summary>/// 接收消息/// </summary>/// <param name="clientUrl"></param>/// <param name="message"></param>private void Receive(string clientUrl, string message){Console.WriteLine(DateTime.Now.ToString() + " | 服务器:【收到】来客户端:" + clientUrl + "的信息:\n" + message);}/// <summary>/// 获取用户实例/// </summary>/// <param name="clientUrl">用户的地址</param>public IWebSocketConnection GetUserSocketInstance(string clientUrl){if (dic_Sockets.ContainsKey(clientUrl))return dic_Sockets[clientUrl];elsereturn null;}/// <summary>/// 关闭某一个用户的连接/// </summary>/// <param name="clientUrl"></param>public void CloseUserConnect(string clientUrl){IWebSocketConnection webSocketConnection = GetUserSocketInstance(clientUrl);if (webSocketConnection != null)webSocketConnection.Close();}/// <summary>/// 关闭与客户端的所有的连接/// </summary>public void CloseAllConnect(){foreach (var item in dic_Sockets.Values){if (item != null){item.Close();}}}public WebSocketHelper(){Init();}
}

使用方法:

internal class Program
{private static List<string> IPList = new List<string>();private static WebSocketHelper webSocketHelpers = new WebSocketHelper();static void Main(string[] args){webSocketHelpers.OnOpen += WebSocketHelper_OnOpen;webSocketHelpers.OnClose += WebSocketHelper_OnClose;webSocketHelpers.OnMessage += WebSocketHelper_OnMessage;Console.ReadLine();}#region WebSocket回调//当收到消息private static void WebSocketHelper_OnMessage(string ip, string msg){for (int i = 0; i < IPList.Count; i++){if (IPList[i] != ip){webSocketHelpers.Send(IPList[i], msg);}}}//当客户端断开连接private static void WebSocketHelper_OnClose(string ip){if (IPList.Contains(ip)){IPList.Remove(ip);}}//当客户端连接上服务器private static void WebSocketHelper_OnOpen(string ip){if (!IPList.Contains(ip)){IPList.Add(ip);}}#endregion//转发所有客户端private static void Relay(string content){if (IPList.Count == 0) return;for (int i = 0; i < IPList.Count; i++){webSocketHelpers.Send(IPList[i], content);}}
}

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

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

相关文章

软件测试计划审核表、试运行审核、试运行申请表、开工申请表

1、系统测试计划审核表 2、系统试运行审核表 3、系统试运行申请表 4、开工申请表 5、开工令 6、项目经理授权书 软件全套资料获取&#xff1a;本文末个人名片直接获取或者进主页。 系统测试计划审核表 系统试运行审核表 系统试运行申请表 开工申请表 开工令 项目经理授权书

青否数字人实时直播带货手机版发布!

青否数字人6大核心 AIGC 技术&#xff0c;让新手小白也能轻松搞定数字人在全平台的稳定直播&#xff0c;并有效规避违规风险&#xff0c;赋能商家开播即赚钱&#xff01; AI主播 只需要录制主播1分钟的绿幕视频&#xff0c;1秒钟就能克隆出一个数字人主播形象。S级真人深度学习…

快速鲁棒的 ICP (Fast and Robust Iterative Closest Point)

迭代最近点&#xff08;Iterative Closet Point&#xff0c;ICP&#xff09;算法及其变体是两个点集之间刚性配准的基本技术&#xff0c;在机器人技术和三维重建等领域有着广泛的应用。ICP的主要缺点是&#xff1a;收敛速度慢&#xff0c;以及对异常值、缺失数据和部分重叠的敏…

未来已来!GPT-5震撼登场,工作与生活面临新变革!

随着科技界领袖对AI系统发展之快的惊叹&#xff0c;新一代大语言模型GPT-5即将登场&#xff0c;引发了我们对工作和日常生活的新一轮思考。微软CTO Kevin Scott和阿里巴巴董事长蔡崇信等人的言论为我们描绘了一幅生动的未来图景&#xff0c;即AI将在我们的生活中扮演越来越重要…

力扣刷题总结 -- 数组28

82. 无法吃午餐的学生数量&#xff08;简单&#xff09; 题目要求&#xff1a; 学校的自助午餐提供圆形和方形的三明治&#xff0c;分别用数字 0 和 1 表示。所有学生站在一个队列里&#xff0c;每个学生要么喜欢圆形的要么喜欢方形的。 餐厅里三明治的数量与学生的数量相同。…

el-form-item的label设置两端对齐

<style scoped> ::v-deep .el-form-item__label {display: inline;text-align-last: justify; } </style>效果如图所示

数据分析必备:一步步教你如何用matplotlib做数据可视化(11)

1、Matplotlib 三维绘图 尽管Matplotlib最初设计时只考虑了二维绘图&#xff0c;但是在后来的版本中&#xff0c;Matplotlib的二维显示器上构建了一些三维绘图实用程序&#xff0c;以提供一组三维数据可视化工具。通过导入Matplotlib包中包含的mplot3d工具包&#xff0c;可以启…

双 μC 的 PWM 频率和分辨率

该方法是过滤 PWM 信号的 HF 分量&#xff0c;只留下与占空比成正比的 LF 或 DC 分量。然而&#xff0c;低通滤波器并不能完全滤除PWM频率&#xff0c;因此LF/DC信号一般会有一些纹波。 有两种方法可以降低 PWM DAC 的纹波。可以降低低通滤波器的截止频率&#xff0c;或者提高…

数据结构-顺序表的插入排序

顺序表的排序可以看作数组排序的拓展。基本逻辑和数组排序的逻辑大同小异。 由于顺序表中可以存放不同种的数据类型&#xff0c;进而和结构体排序又有相似之处。其中要注意的是&#xff08;->&#xff09;和&#xff08;.&#xff09;的区别。 -> 符号是针对指针进行的操…

「动态规划」如何求最长摆动子序列的长度?

376. 摆动序列https://leetcode.cn/problems/wiggle-subsequence/description/ 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为摆动序列。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也…

明白这6个阶段,让你开启从普通员工到管理岗的进阶之路

面对职场的晋升通道&#xff0c;转型管理岗是很多普通职场人实现职业转型的一个可选项。然而&#xff0c;这条道路并非一蹴而就&#xff0c;而是需要经过一系列的阶段和努力&#xff0c;明白这些阶段将有助于职场人顺利走上管理岗位。 一、自我管理阶段。在这一阶段&#xff0…

中文域名费用是多少?

随着互联网的全球化和本地化趋势&#xff0c;中文域名作为文化多样性的体现&#xff0c;越来越受到企业和个人的欢迎。中文域名不仅便于中国用户的记忆和输入&#xff0c;而且也有助于提升品牌的本地化形象。本文将深入探讨中文域名的费用构成&#xff0c;以及在购买中文域名时…

设计软件有哪些?贴图插件篇(2),渲染100邀请码1a12

这次我们继续介绍一些贴图插件。 1、Texporter Texporter是3ds Max的一个插件&#xff0c;用于快速导出贴图。它允许用户一次性导出多个贴图通道&#xff0c;如漫反射、法线、置换等&#xff0c;以各种格式&#xff0c;如TGA、BMP、JPEG等。Texporter提供了简单易用的界面和灵…

react-native在IOS上集成百度地图详解

export default class BaiDuMapTest extends Component { render() { return ( ); } } const styles StyleSheet.create({ container: { flex: 1, justifyContent: ‘center’, alignItems: ‘center’, backgroundColor: ‘#F5FCFF’, }, welcome: { fontSize:…

告别手动邮件处理:使用imbox库轻松管理你的收件箱

imbox库简介&#xff1a; imbox是一个强大的Python库,专为与IMAP服务器交互而设计.IMAP&#xff08;Internet Message Access Protocol&#xff09;是一种用于电子邮件的标准协议,允许用户在远程服务器上管理邮件.imbox库通过IMAP协议与邮件服务器通信,帮助用户轻松地读取、搜索…

在昇腾开发环境合并baichuan2-13B模型的lora文件

概述 别人使用lora的方式对baichuan2-13b的模型进行了微调训练&#xff0c;希望我能部署到mindie服务中。 lora微调后生成的文件如下&#xff1a; # ls checkpoint-lora adapter_config.json optimizer.pt rng_state.pth special_tokens_map.json tokenizer_conf…

只知道无人机能航拍,你已经out啦!!!

无人机行业应用相当广泛&#xff0c;涵盖了航拍、植保、测绘、巡检、安防、物流等多个领域。并且随着科技的不断发展&#xff0c;无人机技术也在不断创新和完善。无人机行业的应用具有多重优势&#xff0c;这些优势使得无人机在众多领域中得以广泛应用并取得显著的成效。 航拍…

【投稿优惠|权威主办】2024年图像、地质测绘与遥感技术国际学术会议(ICIGSRST 2024)

【投稿优惠|权威主办】2024年图像、地质测绘与遥感技术国际学术会议&#xff08;ICIGSRST 2024&#xff09; 2024 International Conference on Image, Geological Surveying and Remote Sensing Technology&#xff08;ICIGSRST 2024&#xff09; ▶会议简介 2024年图像、地质…

应用监控eBPF 版调研

参考&#xff1a; https://www.toutiao.com/article/7327353509735596559/?appnews_articletamp1717488680&use_new_style1&req_id20240604161119838096AAE4AD4F44788E&group_id7327353509735596559&wxshare_count1&tt_fromweixin&utm_sourceweixin&…

vue自定义指令在同一个页面生效一次

vue自定义指令在同一个页面生效一次&#xff0c;在使用自定义指令做el-sele下滑分页时遇到vue自定义指令只生效了一次&#xff0c;是因为放在了v-if中使用&#xff0c;换成v-show就好了