脚本之家

电脑版
提示:原网页已由神马搜索转码, 内容由www.jb51.net提供.
您的位置:首页软件编程C#教程→ C# websocket双向通信

C#实现websocket双向通信的示例代码

  更新时间:2024年06月26日 11:13:56  作者:靓仔很忙i 
本文基于WebSocketSharp实现了websocket双向通信,除基本的客户端向服务端发送消息外,也支持客户端向指定的客户端发送消息、群发消息,其他协议可自定义,废话不多说,直接上干货,需要的朋友可以参考下

一.服务端

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

安装包

Install-Package WebSocketSharp -Pre

定义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();
}
}
}

创建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);
}
}
}
}

创建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,
}
}

使用

WebSocketHelper.Init();

二.客户端

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

安装包

Install-Package WebSocketSharp -Pre

使用

        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);
}
}
}

三.调试

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

输入后,回车,服务端返回

在这里插入图片描述

启动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"}

以上就是C#实现websocket双向通信的示例代码的详细内容,更多关于C# websocket双向通信的资料请关注脚本之家其它相关文章!

相关文章

    • 这篇文章介绍了C#入门之结构类型Struct,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
      2022-05-05
    • 这篇文章主要介绍了C#常用数据结构和算法,这里我们总结了一些知识点,可以帮助大家理解这些概念。
      2016-06-06
    • 这篇文章主要介绍了C#中datatable去重的方法,通过两种不同的方法对比分析了datatable去重的技巧,非常具有实用价值,需要的朋友可以参考下
      2014-10-10
    • 本篇文章对两路归并的数组与链表的实现方法进行了分析介绍。需要的朋友参考下
      2013-05-05
    • 本文主要介绍了C# wpf解决Popup弹出位置异常问题解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
      2021-10-10
    • 这篇文章主要介绍了C#使用HtmlAgilityPack抓取糗事百科内容的方法,实例分析了C#中HtmlAgilityPack的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
      2015-07-07
    • c#开发过程中出现未将对象引用设置到对象的实例,错误一般是下面的原因,软件中也是因为没有获取到数据导致,需要的朋友可以参考下
      2022-09-09
    • 一段实例代码,程序的目的是使用C#实现启动另一程序的方法。技术总监給出了我们这样一个有效的启动程序的有效方法,現在和大家分享下
      2013-07-07
    • C# 大数据导出word的假死报错的处理方法,需要的朋友可以参考一下
      2013-03-03
    • 这篇文章主要介绍了C#实现在匿名方法中捕获外部变量的方法,本文直接给出代码实例,然后分析了代码中的一些知识点,需要的朋友可以参考下
      2015-03-03

    最新评论