制作NetCore WebSocket即时通讯实例详解

这篇文章主要为大家详细介绍了netcore websocket即时通讯示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

NetCore WebSocket 即时通讯示例,供大家参考,具体内容如下

1.新建Netcore Web项目

制作NetCore WebSocket即时通讯实例详解

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 _sockets = new ConcurrentDictionary(); 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(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(buffer);  return socket.SendAsync(segment, WebSocketMessageType.Text, true, ct); } private static async Task ReceiveStringAsync(System.Net.WebSockets.WebSocket socket, CancellationToken ct = default(CancellationToken)) {  var buffer = new ArraySegment(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();

登录后复制

5.建立移动端测试示例 这里采用Ionic3运行在web端

创建ionic3项目略过 新手可点这里查看  或者有Angular2/4项目竟然可直接往下看

(1) 启动Ionic项目

制作NetCore WebSocket即时通讯实例详解

当初创建ionic3项目时候遇到不少问题

比如ionic-cli初始化项目失败 切换到默认npmorg源就好了

比如ionic serve失败 打开代理允许FQ就好了

启动后界面是这样式的

制作NetCore WebSocket即时通讯实例详解

(2) 创建聊天窗口dialog 具体布局实现 模块加载略过直接进入websocket实现

在这之前别忘了启动web项目 否则会出现这样情况 链接不到服务

制作NetCore WebSocket即时通讯实例详解

(3)dialog.ts具体实现

export class Dialog { private ws: any; private msgArr: Array; 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端也实现一个会话窗口

 

 

  

  

登录后复制

 $(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 + '
'); }; 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(''); }); });

登录后复制

基本开发完成 接下来看看效果

7.web和webapp端对话

制作NetCore WebSocket即时通讯实例详解

制作NetCore WebSocket即时通讯实例详解

8.webapp发送 web接收

制作NetCore WebSocket即时通讯实例详解

制作NetCore WebSocket即时通讯实例详解

9.目前就实现了这么多  因为项目还涉及其它技术 暂时不开放源码了

以上就是制作NetCore WebSocket即时通讯实例详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2438809.html

(0)
上一篇 2025年3月3日 11:50:47
下一篇 2025年3月3日 11:51:04

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 如何在Go中使用WebSocket?

    近年来,websocket技术已经成为了web开发中不可或缺的一部分。websocket 是一种在单个 tcp 连接上进行全双工通信的协议,它使得客户端和服务器之间的通信更加流畅和高效。如今,很多现代的web应用程序都使用了websocke…

    编程技术 2025年3月2日
    200
  • 如何在WebSocket中使用Go语言

    在当今世界中,网络通信已经成为不可或缺的一部分。websocket技术是一种在web浏览器和服务器之间建立双向通信的协议,这种通信方式具有高效性和实时性,因此在现代web应用程序中越来越受欢迎。同时,go语言也因其高效性和易于编写并发程序的…

    编程技术 2025年3月2日
    200
  • 如何使用Go语言构建WebSocket服务器

    websockets是一种先进的网络协议,允许客户端和服务器之间在单个tcp连接上进行双向通信。websockets支持实时数据传输、在线游戏、聊天室等应用程序,因此备受开发者欢迎。 Go语言是一种高性能、简洁的编程语言,适合构建WebSo…

    编程技术 2025年3月2日
    200
  • 如何使用Go语言框架实现Websocket视频直播

    随着互联网技术的快速发展,视频直播成为了一种重要的网络传媒方式,吸引了越来越多的用户。而websocket技术又是支持实时通信的关键之一,使用go语言框架实现websocket视频直播成为了许多开发者的研究方向。本文将介绍如何使用go语言框…

    编程技术 2025年3月2日
    200
  • 为什么我的Go程序无法正确使用Websocket中间件?

    websocket是一种用于客户端和服务器之间实时通信的协议,它允许双方建立一个持久性的连接,使得数据可以实时传送。在go语言中,我们可以使用第三方框架或库来处理websocket连接,比如gorilla/websocket。然而,如果你的…

    编程技术 2025年3月2日
    200
  • Gorilla WebSocket库:Go语言实现的WebSocket库

    随着互联网技术的不断发展,网络通信已经成为了人们日常生活中不可或缺的重要组成部分。而websocket作为一种新的通信协议,也逐渐受到了越来越多的关注和应用。在实现websocket通信的过程中,gorilla websocket库是一个不…

    编程技术 2025年3月2日
    200
  • 如何使用Go和http.Transport进行WebSocket通信?

    如何使用go和http.transport进行websocket通信? WebSocket 是一种在网络应用中,提供双向通信的协议。它允许服务器主动向客户端推送消息,而不需要客户端先发起请求。在Go语言中,可以使用http.Transpor…

    编程技术 2025年3月2日
    200
  • Golang web项目搭建-1

    项目类型 项目搭建系列先选取的是最为常见的web项目。 开发环境-Mac、Windows、linux 开发环境的选取随意吧,毕竟Go也是跨平台的。 开发工具-Goland 开发工具的选取,因人而异吧,我主要使用Goland,新手的话还是比较…

    编程技术 2025年3月2日
    200
  • Golang开发:使用Websocket实现实时聊天应用

    Golang开发:使用Websocket实现实时聊天应用 在当今的互联网时代,实时通信已经成为了人们生活中不可或缺的一部分。无论是即时消息、实时聊天还是实时更新,都需要一种高效稳定的通信方式来实现。而Websocket正是一种非常适合实时通…

    2025年3月1日
    200
  • golang Websocket开发指南:实现多人在线日程管理功能

    Golang Websocket开发指南:实现多人在线日程管理功能 导言:随着现代生活的快节奏和多任务需求,我们经常需要在日程安排上做出调整和协调。而多人在线日程管理功能能够帮助多人之间实时协作共享日程,提高工作效率。本文将介绍如何使用Go…

    2025年3月1日
    200

发表回复

登录后才能评论