全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

NetCore WebSocket即时通讯示例

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通信  # 可点  # 这是  # 就好了  # 我要  # 在这  # 是这样  # 这么多  # 到我  # 来看看  # 别忘了  # 可直接  # 则会  # 即时通讯  # 具体内容  # 直接进入  # 大家多多  # 切换到  # 就可以  # 往下看  # 端了 


相关文章: 东莞市网站制作公司有哪些,东莞找工作用什么网站好?  建站之星展会模板:智能建站与自助搭建高效解决方案  模具网站制作流程,如何找模具客户?  如何解决VPS建站LNMP环境配置常见问题?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  网站制作新手教程,新手建设一个网站需要注意些什么?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  C++时间戳转换成日期时间的步骤和示例代码  公司网站制作价格怎么算,公司办个官网需要多少钱?  营销式网站制作方案,销售哪个网站招聘效果最好?  简单实现Android文件上传  完全自定义免费建站平台:主题模板在线生成一站式服务  长沙企业网站制作哪家好,长沙水业集团官方网站?  ,石家庄四十八中学官网?  个人网站制作流程图片大全,个人网站如何注销?  详解jQuery停止动画——stop()方法的使用  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  h5在线制作网站电脑版下载,h5网页制作软件?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  5种Android数据存储方式汇总  如何快速重置建站主机并恢复默认配置?  香港服务器如何优化才能显著提升网站加载速度?  制作农业网站的软件,比较好的农业网站推荐一下?  如何用虚拟主机快速搭建网站?详细步骤解析  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  建站之星2.7模板快速切换与批量管理功能操作指南  建设网站制作价格,怎样建立自己的公司网站?  如何通过主机屋免费建站教程十分钟搭建网站?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  PHP 500报错的快速解决方法  建站之星后台密码如何安全设置与找回?  如何在IIS服务器上快速部署高效网站?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  建站之星如何优化SEO以实现高效排名?  网站制作模板下载什么软件,ppt模板免费下载网站?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何在万网ECS上快速搭建专属网站?  ,网站推广常用方法?  高端建站三要素:定制模板、企业官网与响应式设计优化  平台云上自主建站:模板化设计与智能工具打造高效网站  微信推文制作网站有哪些,怎么做微信推文,急?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  如何设计高效校园网站?  建站之星价格显示格式升级,你的预算足够吗? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。