HTML5 WebSocket+Asp.Netインスタンス4-ユーザーID、バックグラウンドプッシュ

3096 ワード

一、Asp.Netバックグラウンド操作定義
注意:現在の例では、単一のリンクの開きのみが考慮されており、マルチページの開きやブラウザの開きを変更する場合は処理されていません.
/// 
/// Socket      
/// 
public class SocketOneController : Controller
{
    static Dictionary CONNECT_POOL = new Dictionary();//     
    //  1,  socke  
    public void One(string user)
    {
        HttpContextBase context = ControllerContext.HttpContext;
        context.AcceptWebSocketRequest(async (ctx) =>
        {
            //  socket  
            WebSocket socket = ctx.WebSocket;

            while (true)
            {
                ArraySegment buffer = new ArraySegment(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(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 buffer = new ArraySegment(bytes);
        socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);

        return "    ";
    }
}

二、Html 5フロント単純コード例
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();
});

 
詳細:
HTML 5 WebSocketインスタンス(3)-ファイルアップロード処理
HTML 5 WebSocketAPIインスタンス(二)
HTML 5 WebSocketインスタンス(一)