asp.net mvc 通过api来实现websocket通信

如果要按照本实例来实现websocket通信,那么必须确认iis是8.0版本及以上,因为低版本好像不支持这种实现方式。

  1. 创建API控制器MessageSendController;
  2. 在控制器下创建GET方法来实现websocket的初始化,首选判断前端访问时发是websokcet访问 
    if (HttpContext.Current.IsWebSocketRequest),如果是就初始化HttpContext.Current.AcceptWebSocketRequest(Websockets);

  3. 创建Websockets方法用来实现接收和发送消息,具体代码如下

public static List<Models.socketMod> Listws = new List<socketMod>();
private async Task Websockets(AspNetWebSocketContext arg) 
{
    var web = arg.WebSocket;
    while (true) 
    {
        //ArraySegment数组的小抽屉,用于对该数组中元素的范围进行分隔
        ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
        //开始接收
        WebSocketReceiveResult result = await web.ReceiveAsync(buffer, CancellationToken.None);
        //判断通信状态是否是打开的
        if (web.State == WebSocketState.Open) 
        {
            string message = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
            //这里可以自己自定义,我当时是用于前端可以做出停止指令来操作控制后台的任务,所以这样写
            if(message.Contains("停止")) 
            {
                var id = message.Split('|').LastOrDefault()?.ObjTolong();
                var mesd = Listws.FirstOrDefault(p => p.userid == id);
                mesd.isstop = true;
            }
            //这里是接收前端发来的消息,然后做判断的,其中socketMod是自定义的一个实体类,用来存储与客户端连接的信息,比如后台消息要发送到前台时要通过唯一id来在此实体类数组里查找,然后进行指定发送到哪个客户端上,这个可以用来存放在CallContext(线程里唯一)里,这样可以做成简单的聊天器。
            if (message.ObjTolong() > 0&&!Listws.Exists(p=>p.userid==message.ObjTolong())) 
            {
                var md=new Models.socketMod();
                md.SecWebSocketKey = arg.SecWebSocketKey;
                md.userid = message.ObjTolong();
                md.webst = web;
                Listws.Add(md);
            }
            var mes = new BLL.mescontent();
            mes.jdt = "0";
            mes.mess = "成功连接 :"  + DateTime.Now.ToLongTimeString();
            buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(mes.MToString()));
            //发送消息到前台,这里可以通过调用Listws实体类数组来指定发送或群发
            await web.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
        } else 
        {
            if (Listws.Exists(p=>p.SecWebSocketKey==arg.SecWebSocketKey)) 
            {
                Listws.Remove(Listws.FirstOrDefault(p=>p.SecWebSocketKey.Equals(arg.SecWebSocketKey)));
                SessionHelper.SetCach("websockect", Listws);
            }
            break;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

4,前端代码的

 var ws;
    var $msg = $("#msged");
    var $jdt = $("#jindut");
    $(function() {
        connec();
    });
    function connec()
    {
    //初始化websocket链接
        ws = new WebSocket("ws://" + window.location.hostname + ":" + window.location.port + "/api/MessageSend");
        ws.onopen = function () {
            $msg.html("成功连接服务器");
            send();
        }
        ws.onmessage = function (msg) {

            var md = $.parseJSON(msg.data);
            $msg.html(md.mess);           
            $jdt.css("width", md.jdt + "%");
            $jdt.attr("aria-valuenow", md.jdt);


        }
        ws.onerror = function (err) {
            $msg.html(err);
        }
        ws.onclose = function () {
            $msg.html("连接已经关闭");
        }
    }
    //发送消息到后台
    function send() {
        // alert(ws.readyState);
        if (ws.readyState === WebSocket.OPEN) {
            ws.send('@SessionHelper.GetSession(MeSession.UserManageID)');
        } else {
            $msg.html("链接已经关闭");
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值