NetCore WebSocket即时通讯示例
发布时间 - 2026-01-11 01:56:26 点击率:次NetCore WebSocket 即时通讯示例,供大家参考,具体内容如下

1.新建Netcore Web项目
2.创建简易通讯协议
public class MsgTemplate
{
public string SenderID { get; set; }
public string ReceiverID { get; set; }
public string MessageType { get; set; }
public string Content { get; set; }
}
SenderID发送者ID
ReceiverID 接受者ID
MessageType 消息类型 Text Voice 等等
Content 消息内容
3.添加中间件ChatWebSocketMiddleware
public class ChatWebSocketMiddleware
{
private static ConcurrentDictionary<string, System.Net.WebSockets.WebSocket> _sockets = new ConcurrentDictionary<string, System.Net.WebSockets.WebSocket>();
private readonly RequestDelegate _next;
public ChatWebSocketMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (!context.WebSockets.IsWebSocketRequest)
{
await _next.Invoke(context);
return;
}
System.Net.WebSockets.WebSocket dummy;
CancellationToken ct = context.RequestAborted;
var currentSocket = await context.WebSockets.AcceptWebSocketAsync();
//string socketId = Guid.NewGuid().ToString();
string socketId = context.Request.Query["sid"].ToString();
if (!_sockets.ContainsKey(socketId))
{
_sockets.TryAdd(socketId, currentSocket);
}
//_sockets.TryRemove(socketId, out dummy);
//_sockets.TryAdd(socketId, currentSocket);
while (true)
{
if (ct.IsCancellationRequested)
{
break;
}
string response = await ReceiveStringAsync(currentSocket, ct);
MsgTemplate msg = JsonConvert.DeserializeObject<MsgTemplate>(response);
if (string.IsNullOrEmpty(response))
{
if (currentSocket.State != WebSocketState.Open)
{
break;
}
continue;
}
foreach (var socket in _sockets)
{
if (socket.Value.State != WebSocketState.Open)
{
continue;
}
if (socket.Key == msg.ReceiverID || socket.Key == socketId)
{
await SendStringAsync(socket.Value, JsonConvert.SerializeObject(msg), ct);
}
}
}
//_sockets.TryRemove(socketId, out dummy);
await currentSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", ct);
currentSocket.Dispose();
}
private static Task SendStringAsync(System.Net.WebSockets.WebSocket socket, string data, CancellationToken ct = default(CancellationToken))
{
var buffer = Encoding.UTF8.GetBytes(data);
var segment = new ArraySegment<byte>(buffer);
return socket.SendAsync(segment, WebSocketMessageType.Text, true, ct);
}
private static async Task<string> ReceiveStringAsync(System.Net.WebSockets.WebSocket socket, CancellationToken ct = default(CancellationToken))
{
var buffer = new ArraySegment<byte>(new byte[8192]);
using (var ms = new MemoryStream())
{
WebSocketReceiveResult result;
do
{
ct.ThrowIfCancellationRequested();
result = await socket.ReceiveAsync(buffer, ct);
ms.Write(buffer.Array, buffer.Offset, result.Count);
}
while (!result.EndOfMessage);
ms.Seek(0, SeekOrigin.Begin);
if (result.MessageType != WebSocketMessageType.Text)
{
return null;
}
using (var reader = new StreamReader(ms, Encoding.UTF8))
{
return await reader.ReadToEndAsync();
}
}
}
}
控制只有接收者才能收到消息
if (socket.Key == msg.ReceiverID || socket.Key == socketId)
{
await SendStringAsync(socket.Value,JsonConvert.SerializeObject(msg), ct);
}
4.在Startup.cs中使用中间件
app.UseWebSockets(); app.UseMiddleware<ChatWebSocketMiddleware>();
5.建立移动端测试示例 这里采用Ionic3运行在web端
创建ionic3项目略过 新手可点这里查看 或者有Angular2/4项目竟然可直接往下看
(1) 启动Ionic项目
当初创建ionic3项目时候遇到不少问题
比如ionic-cli初始化项目失败 切换到默认npmorg源就好了
比如ionic serve失败 打开代理允许FQ就好了
启动后界面是这样式的
(2) 创建聊天窗口dialog 具体布局实现 模块加载略过直接进入websocket实现
在这之前别忘了启动web项目 否则会出现这样情况 链接不到服务
(3)dialog.ts具体实现
export class Dialog {
private ws: any;
private msgArr: Array<any>;
constructor(private httpService: HttpService) {
this.msgArr = [];
}
ionViewDidEnter() {
if (!this.ws) {
this.ws = new WebSocket("ws://localhost:56892?sid=222");
this.ws.onopen = () => {
console.log('open');
};
this.ws.onmessage = (event) => {
console.log('new message: ' + event.data);
var msgObj = JSON.parse(event.data);
this.msgArr.push(msgObj);;
};
this.ws.onerror = () => {
console.log('error occurred!');
};
this.ws.onclose = (event) => {
console.log('close code=' + event.code);
};
}
}
sendMsg(msg) {//msg为我要发送的内容 比如"hello world"
var msgObj = {
SenderID: "222",
ReceiverID: "111",
MessageType: "text",
Content: msg
};
this.ws.send(JSON.stringify(msgObj));
}
ws://localhost:56892?sid=222 这是websocke服务链接地址
sid表示着我这个端的WebSocke唯一标识 找到这个key就可以找到我这个用户端了
6.在web端也实现一个会话窗口
<div class="container" style="width:90%;margin:0px auto;border:1px solid steelblue;"> <div class="msg"> <div id="msgs" style="height:200px;"></div> </div> <div style="display:block;width:100%"> <input type="text" style="max-width:unset;width:100%;max-width:100%" id="MessageField" placeholder="type message and press enter" /> </div> </div>
<script>
$(function () {
$('.navbar-default').addClass('on');
var userName = '@Model';
var protocol = location.protocol === "https:" ? "wss:" : "ws:";
var wsUri = protocol + "//" + window.location.host + "?sid=111";
var socket = new WebSocket(wsUri);
socket.onopen = e => {
console.log("socket opened", e);
};
socket.onclose = function (e) {
console.log("socket closed", e);
};
socket.onmessage = function (e) {
console.log(e);
var msgObj = JSON.parse(e.data);
$('#msgs').append(msgObj.Content + '<br />');
};
socket.onerror = function (e) {
console.error(e.data);
};
$('#MessageField').keypress(function (e) {
if (e.which != 13) {
return;
}
e.preventDefault();
var message = $('#MessageField').val();
var msgObj = {
SenderID:"111",
ReceiverID:"222",
MessageType: "text",
Content: message
};
socket.send(JSON.stringify(msgObj));
$('#MessageField').val('');
});
});
</script>
基本开发完成 接下来看看效果
7.web和webapp端对话
8.webapp发送 web接收
9.目前就实现了这么多 因为项目还涉及其它技术 暂时不开放源码了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# NetCore
# WebSocket
# 通讯
# .NET Core 基于Websocket的在线聊天室实现
# Asp.net Core中如何使用中间件来管理websocket
# Asp.Net Core中WebSocket绑定的方法详解
# 在Asp.net core中实现websocket通信
# 可点
# 这是
# 就好了
# 我要
# 在这
# 是这样
# 这么多
# 到我
# 来看看
# 别忘了
# 可直接
# 则会
# 即时通讯
# 具体内容
# 直接进入
# 大家多多
# 切换到
# 就可以
# 往下看
# 端了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
Laravel如何实现文件上传和存储?(本地与S3配置)
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Python面向对象测试方法_mock解析【教程】
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel如何使用Blade模板引擎?(完整语法和示例)
Laravel如何处理表单验证?(Requests代码示例)
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
零服务器AI建站解决方案:快速部署与云端平台低成本实践
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
linux写shell需要注意的问题(必看)
Laravel怎么实现验证码(Captcha)功能
网站制作壁纸教程视频,电脑壁纸网站?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
制作电商网页,电商供应链怎么做?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
如何在腾讯云服务器上快速搭建个人网站?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
如何快速登录WAP自助建站平台?
如何快速打造个性化非模板自助建站?
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
如何用y主机助手快速搭建网站?
Bootstrap整体框架之CSS12栅格系统
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
原生JS实现图片轮播切换效果
Laravel如何优化应用性能?(缓存和优化命令)
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
如何用PHP工具快速搭建高效网站?
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
如何在IIS中新建站点并配置端口与物理路径?
怎么用AI帮你设计一套个性化的手机App图标?
如何在服务器上三步完成建站并提升流量?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
Linux系统命令中screen命令详解
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
如何在云虚拟主机上快速搭建个人网站?
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
如何快速使用云服务器搭建个人网站?

