zoukankan      html  css  js  c++  java
  • websocket简易demo

    websocket可以通过长连接通信,类似于socket

    今天实现一个最简单的demo,记录一下

    参考文档 https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets?view=aspnetcore-3.1

    环境

    win10 / vs2019 / .net core 3.1

    建立项目

    1.建立.net core的控制台项目

    2.添加nuget包

      // .net core kestrel服务器

      Microsoft.AspNetCore.Server.Kestrel 

      // websocket 包,.net core自家的

           Microsoft.AspNetCore.WebSockets

      // 配置工具,不是必须

      Microsoft.Extensions.Configuration.Json

    3.添加文件

      kestrel.json // 设置kestrel服务器监听端口

    {
      "server.urls": "http://localhost:10800;http://*:10800"
    }

    4.Program.cs  main方法修改

            static void Main(string[] args)
            {
                
                // kestrel服务器配置文件载入
                IConfiguration kestrelCfg = new ConfigurationBuilder()
                    .AddJsonFile("kestrel.json")
                    .Build();
    
                // websocket配置文件
                var webSocketCfg = new WebSocketOptions()
                {
                    // 向客户端发送“ping”帧的频率,以确保代理保持连接处于打开状态。.默认值为 2 分钟.
                    KeepAliveInterval = TimeSpan.FromSeconds(120),
                    // 用于接收数据的缓冲区的大小.高级用户可能需要对其进行更改,以便根据数据大小调整性能.默认值为4 KB.
                    ReceiveBufferSize = 4 * 1024
                };

    相比http连接,websocket建立连接后,可以主动向客户端发送消息.为了验证这一点,在服务端做了一个定时器

    当websocket建立连接后,定时向客户端发送当前时间

    t = new System.Timers.Timer
    {
        Interval = 2000
    };
    t.Elapsed += T_Elapsed;
    t.Start();
            private static void T_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                
                    WebSocket webSocket = connDict[1];
                    byte[] rebuffer = System.Text.Encoding.UTF8.GetBytes("服务器报时: " + DateTimeOffset.Now.ToString());
                    ArraySegment<byte> re = new ArraySegment<byte>(rebuffer, 0, rebuffer.Length);
    
                    webSocket.SendAsync(re, WebSocketMessageType.Text, true, CancellationToken.None);
                 
            }

    5.添加index.html

      前端发起websocket请求,依靠WebSocket对象,

      文档 http://www.ruanyifeng.com/blog/2017/05/websocket.html

        https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket

        https://www.runoob.com/html/html5-websocket.html

      这个对象比较简单,close()方法关闭连接,send()方法发消息,有几个相应事件,还有连接状态

     // 打开一个 web socket
         let ws = new WebSocket("ws://localhost:10800/ws");
    // 打开
          ws.onopen = function (e) {
            // Web Socket 已连接上,使用 send() 方法发送数据
            printMsg('sebsocket连接成功!');
          };
    
          // 如果连接发生错误 不要使用try catch处理,使用这个事件
          ws.onerror = function (e) {
            printMsg('websocket初始化错误!');
          }

    事件

    open Socket.onopen 连接建立时触发
    message Socket.onmessage 客户端接收服务端数据时触发
    error Socket.onerror 通信发生错误时触发
    close Socket.onclose 连接关闭时触发

    方法

    Socket.send()

    使用连接发送数据

    Socket.close()

    关闭连接

    6.测试

    运行服务端程序,kestrel服务器开启监听

    打开index.html文件,点击建立连接,发送一点消息,此时会发现不断收到消息

    以前使用http要定时的发请求,这里没有发请求,服务端的报时消息发来了,说明websocket是长连接的

    可以在另外打开一个浏览器,发起新的websocket连接,结果同样.

    7.demo地址

    https://github.com/mirrortom/Demo/tree/master/WebSocketTest

  • 相关阅读:
    二叉搜索查找排序树
    多项式运算
    赫夫曼编码及应用
    利用python画出动态高优先权优先调度
    利用python画出SJF调度图
    支持向量机
    fisher线性分类器
    Codeforces Round #520 (Div. 2)
    Codeforces Round #510 (Div. 2)
    Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)
  • 原文地址:https://www.cnblogs.com/mirrortom/p/13344605.html
Copyright © 2011-2022 走看看