HTML5 WebSocket+Asp.Net 实例四-用户标识,后台推送

一、Asp.Net 后台操作定义

注:当前示例仅考虑了单个链接的打开,对于多页面打开或者换浏览器打开的情况没做处理。

/// <summary>
/// Socket后台代码示例
/// </summary>
public class SocketOneController : Controller
{
    static Dictionary<string, WebSocket> CONNECT_POOL = new Dictionary<string, WebSocket>();//用户连接池
    //测试1,定义socke监听
    public void One(string user)
    {
        HttpContextBase context = ControllerContext.HttpContext;
        context.AcceptWebSocketRequest(async (ctx) =>
        {
            //开启socket监听
            WebSocket socket = ctx.WebSocket;

            while (true)
            {
                ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
                CancellationToken token;
                if (socket.State == WebSocketState.Open)
                {
                    //后台上线处理
                    if (CONNECT_POOL.Keys.Contains(user) == false)
                        CONNECT_POOL.Add(user, socket);

                    WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, token);
                    string userMessage = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);

                    userMessage = "You sent: " + userMessage + " at " +
                    DateTime.Now.ToLongTimeString();

                    //响应处理
                    buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(userMessage));
                    await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                }
                else
                {
                    //离线处理
                    CONNECT_POOL.Remove(user);
                    break;
                }
            }
        });
    }
    //后台执行发送操作
    public string Handle(string user)
    {
        if (CONNECT_POOL.Keys.Contains(user) == false)
            return "当前连接已经断开";

        WebSocket socket = CONNECT_POOL[user];

        byte[] bytes = Encoding.UTF8.GetBytes($"后台发送通知 at {DateTime.Now.ToString()}");
        ArraySegment<byte> buffer = new ArraySegment<byte>(bytes);
        socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);

        return "操作成功";
    }
}

二、Html5 前台简单代码示例

var url = 'ws://localhost:61870/socketone/one?user=' + $('#userOne').val();
var ws = new WebSocket(url);
ws.onopen = function () {
    console.info('创建连接成功');
}
ws.onmessage = function (e) {
    var data = e.data;
    console.info(data);
}
ws.onerror = function (e) {
    console.error(e);
}
ws.onclose = function () {
    console.info('连接关闭');
}
//发送内容处理
$('#btnOne').click(function () {
    if (ws.readyState == WebSocket.OPEN) {
        ws.send("来此客户端测试内容");
    } else {
        console.error('连接已经关闭');
    }
});
//关闭连接
$('#btnTwo').click(function () {
    ws.close();
});

 

更多:

HTML5 WebSocket实例(三)-文件上传处理

HTML5 WebSocketAPI实例(二)

HTML5 WebSocket实例(一)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值