加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSS
您当前的位置:首页 > 学习资料

在IIS上搭建WebSocket服务器

时间:2021-03-21 23:01:29  来源:  作者:
DEt华陈数据科技
 
服务器端代码编写
1.新建一个ASP.net Web MVC5项目
 
2.新建一个“一般处理程序”
3.Handler1.ashx代码如下:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.WebSockets;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using System.Web;
  9. using System.Web.WebSockets;
  10.  
  11.  
  12. namespace WebApplicationWebsocketHandler
  13. {
  14.     /// <summary>
  15.     /// 离线消息
  16.     /// </summary>
  17.     public class MessageInfo
  18.     {
  19.         public MessageInfo(DateTime _MsgTime, ArraySegment<byte> _MsgContent)
  20.         {
  21.             MsgTime = _MsgTime;
  22.             MsgContent = _MsgContent;
  23.         }
  24.         public DateTime MsgTime { get; set; }
  25.         public ArraySegment<byte> MsgContent { get; set; }
  26.     }
  27.  
  28.  
  29.  
  30.  
  31.     /// <summary>
  32.     /// Handler1 的摘要说明
  33.     /// </summary>
  34.     public class Handler1 : IHttpHandler
  35.     {
  36.         private static Dictionary<string, WebSocket> CONNECT_POOL = new Dictionary<string, WebSocket>();//用户连接池
  37.         private static Dictionary<string, List<MessageInfo>> MESSAGE_POOL = new Dictionary<string, List<MessageInfo>>();//离线消息池
  38.         public void ProcessRequest(HttpContext context)
  39.         {
  40.             //context.Response.ContentType = "text/plain";
  41.             //context.Response.Write("Hello World");
  42.             if (context.IsWebSocketRequest)
  43.             {
  44.                 context.AcceptWebSocketRequest(ProcessChat);
  45.             }
  46.         }
  47.  
  48.         private async Task ProcessChat(AspNetWebSocketContext context)
  49.         {
  50.             WebSocket socket = context.WebSocket;
  51.             string user = context.QueryString["user"].ToString();
  52.  
  53.             try
  54.             {
  55.                 #region 用户添加连接池
  56.                 //第一次open时,添加到连接池中
  57.                 if (!CONNECT_POOL.ContainsKey(user))
  58.                     CONNECT_POOL.Add(user, socket);//不存在,添加
  59.                 else
  60.                     if (socket != CONNECT_POOL[user])//当前对象不一致,更新
  61.                         CONNECT_POOL[user] = socket;
  62.                 #endregion
  63.  
  64.                 #region 离线消息处理
  65.                 if (MESSAGE_POOL.ContainsKey(user))
  66.                 {
  67.                     List<MessageInfo> msgs = MESSAGE_POOL[user];
  68.                     foreach (MessageInfo item in msgs)
  69.                     {
  70.                         await socket.SendAsync(item.MsgContent, WebSocketMessageType.Text, true, CancellationToken.None);
  71.                     }
  72.                     MESSAGE_POOL.Remove(user);//移除离线消息
  73.                 }
  74.                 #endregion
  75.  
  76.                 string descUser = string.Empty;//目的用户
  77.                 while (true)
  78.                 {
  79.                     if (socket.State == WebSocketState.Open)
  80.                     {
  81.                         ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[2048]);
  82.                         WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
  83.  
  84.                         #region 消息处理(字符截取、消息转发)
  85.                         try
  86.                         {
  87.                             #region 关闭Socket处理,删除连接池
  88.                             if (socket.State != WebSocketState.Open)//连接关闭
  89.                             {
  90.                                 if (CONNECT_POOL.ContainsKey(user)) CONNECT_POOL.Remove(user);//删除连接池
  91.                                 break;
  92.                             }
  93.                             #endregion
  94.  
  95.                             string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);//发送过来的消息
  96.                             string[] msgList = userMsg.Split('|');
  97.                             if (msgList.Length == 2)
  98.                             {
  99.                                 if (msgList[0].Trim().Length > 0)
  100.                                     descUser = msgList[0].Trim();//记录消息目的用户
  101.                                 buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(msgList[1]));
  102.                             }
  103.                             else
  104.                                 buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(userMsg));
  105.  
  106.                             if (CONNECT_POOL.ContainsKey(descUser))//判断客户端是否在线
  107.                             {
  108.                                 WebSocket destSocket = CONNECT_POOL[descUser];//目的客户端
  109.                                 if (destSocket != null && destSocket.State == WebSocketState.Open)
  110.                                     await destSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
  111.                             }
  112.                             else
  113.                             {
  114.                                 Task.Run(() =>
  115.                                 {
  116.                                     if (!MESSAGE_POOL.ContainsKey(descUser))//将用户添加至离线消息池中
  117.                                         MESSAGE_POOL.Add(descUser, new List<MessageInfo>());
  118.                                     MESSAGE_POOL[descUser].Add(new MessageInfo(DateTime.Now, buffer));//添加离线消息
  119.                                 });
  120.                             }
  121.                         }
  122.                         catch (Exception exs)
  123.                         {
  124.                             //消息转发异常处理,本次消息忽略 继续监听接下来的消息
  125.                         }
  126.                         #endregion
  127.                     }
  128.                     else
  129.                     {
  130.                         break;
  131.                     }
  132.                 }//while end
  133.             }
  134.             catch (Exception ex)
  135.             {
  136.                 //整体异常处理
  137.                 if (CONNECT_POOL.ContainsKey(user)) CONNECT_POOL.Remove(user);
  138.             }
  139.         }
  140.  
  141.  
  142.         public bool IsReusable
  143.         {
  144.             get
  145.             {
  146.                 return false;
  147.             }
  148.         }
  149.     }
  150. }
复制代码
4.运行看是否报错,若没错将我们的服务器网站发布到IIS(支持WebSocket的IIS上,win7的系统时不可以的)上
点击“生成”->"发布........",以文件系统的方式发布,目标位置为我们创建的IIS网站对应的物理路径
 
 
 
DEt华陈数据科技
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
实现php间隔一段时间执行一次某段代码
实现php间隔一段时间
相关文章
    无相关信息
栏目更新
栏目热门