.Net WebSocket学习之旅(一)

原生Websocket在.Net环境的实现


使用原生的websocket做了个简单的demo,适合初学的知道怎么个实现。

我参考的是网上的,部分雷同,见谅


聊天室功能可以在此基础上加工,我后面会在SignalR框架中实现

下面是大致的代码框架,实现是加上自己的业务的,我会在后面提供我的源代码,丰富了框架,一个简单的demo

一、前端Html中的Js

           
           var socket;//创建websocket对象

          $(document).ready(function(){
            //创建链接,打开连接。使用ws协议,如果报错注意IIS版本,至少IIS8(我不太确定)
            socket = new WebSocket('ws://' + window.location.hostname + ':' + window.location.port + '/App/webSocketHandler.ashx');
           
            socket.onopen = function (event) {
            //监控websocket打开的方法
            }

            socket.onclose = function (event) {
            //监控服务器关闭websocket的方法
//浏览器关闭时、url跳转时,服务器会接收到当前websocket关闭的通知
}
 socket.onerror = function (event) {
            //监控websocket关闭的方法

}  socket.onmessage = function (event) { //接收到服务器消息,具体信息是json格式,在event的data中。  }
        })
function sendMsg(msg){
           //发送消息到服务器

  if (socket.readyState == WebSocket.OPEN) {
      socket.send(msg);
    }
}


二、前端Html中的html、css,略,看我源代码

三、后台处理程序

 public class webSocketHandler : IHttpHandler
   {
      //获取Dal层的websocket列表,当前每个请求视为一个websocket对象,进来保存,离开移除。
     public static List<WebSocket> lstWs = WebSocketHelper.lstWs;
    
     public void ProcessRequest(HttpContext context)
      {
         if (context.IsWebSocketRequest)
           {
               context.AcceptWebSocketRequest(ProcessChat);
           }
       }
     
       //一个异步线程
        private async Task ProcessChat(AspNetWebSocketContext context)
        {
            string rspMsg = string.Empty;
            WebSocket socket = context.WebSocket;//获取当前的websocket对象
            lstWs.Add(socket);//加入当前的websocket对象

            //while不会进入死循环
            while (true)
            {
                if (socket.State == WebSocketState.Open)
                {
                    ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[2048]);
                    WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
                    
                    //当接收到浏览器关闭、url跳转、报错等问题,服务器会接收到websocket关闭通知
                    if (result.MessageType == WebSocketMessageType.Close)
                    {   
                        //异步关闭websocket连接
                        await socket.CloseAsync(WebSocketCloseStatus.Empty, string.Empty, CancellationToken.None);
                        lstWs.Remove(socket);
                        break;
                    }

                    //这里打断点调试,你会发现while程序不会死循环,直到下面的方法收到信息,或者上面接收到关闭
                    string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
                    rspMsg = DateTime.Now.ToLongTimeString() + "  你发送了:" + userMsg;

                    buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(rspMsg));
                   //发送到当前用户的客户端
                    await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                }
                else
                {
                    break;
                }
            }
        }

   //DAL层的程序
  public class WebSocketHelper
  {
    public static List<WebSocket> lstWs = new List<WebSocket>();

     /// <summary>
     /// 封装推送消息,然后发送给每位在线的
     /// </summary>
     /// <param name="json">json格式推送内容</param>
    public void Push2EveryOne(string json = "")
    {
     //封装推送消息,然后发送给每位在线的
     ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[2048]);
     buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(json));

     foreach (WebSocket socket in lstWs)
     {
       socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
     }
    }
  }


我做了个简单的demo,看下截图,里面稍微丰富了下,有兴趣下载源码(MVC4.5)






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值