毕业论文
您现在的位置: 货车 >> 货车选择 >> 正文 >> 正文

websocket在netcore中的

来源:货车 时间:2022/8/8
中医白癜风 http://news.39.net/bjzkhbzy/170910/5687476.html

HTTP是一种无状态协议,每次连接服务器都是新的状态,好处是简单、易于管理,能从容应对大规模的访问请求。缺点是每次访问服务器都要通过请求头传递一些数据,比如我是谁(对于需要认证的服务),我要干什么等等,服务器才能做出相应的回应。有时候,请求头包含了很多数据(几KB甚至几MB),要占用服务器的带宽资源,给服务器造成很大的压力,尤其是访问的人数比较多时。

同时,HTTP是基于TCP/IP协议,每次连接时客户端和服务器都需要经过3次握手,在一些需要频繁访问服务器接口的场景就显得不合适了。比如实时获取车辆运行数据,通过ajax轮询去请求服务接口,每次需要重复发送大量的请求头数据,还要频繁连接服务器。这种情况,只需要客户端和服务器建立长连接,实现全双工通信,服务器可以在有需要的时候主动向客户端推送数据,客户端不必盲目(不知道服务端是否有新数据)的请求服务器的数据,而websocket就是其中一种解决方案。

模拟货车在路上跑来理解和认识websocket

先设定一个场景,地图上有一辆货车,车上有导航设备,设备会持续发送位置坐标到服务器,发送频率是不一定的。服务器只要接收到了导航设备发送过来的坐标数据就立刻推送至连接的客户端,客户端根据坐标数据控制货车在地图上移动,实现实时查看货车的当前位置。

websocket请求通过中间件来处理,首先新增一个中间件类WSMiddlewere,如下图所示。

中间件由以下几个部分构成:

构造函数:公共构造函数并且带有一个Request委托参数,这个参数是实现中间件必须的。同时构造函数里新开了一个线程用于处理服务器推送消息至客户端,SengMsg函数。创建静态变量ClientList用于保存连接到服务器的客户端。InvokeAsync函数:当有新的客户请求发过来时,通过该函数进行处理,这个函数也是实现中间件必须要添加的一个函数。关键的地方在于第33行新增客户到ClientList,用于在SengMsg函数里推送消息。第35行ReceiveMsg函数处理客户发过来的消息。最后就是接收消息ReceiveMsg函数、发送消息SengMsg函数的处理,继续往下看。下图是处理客户端消息的ReveiveMsg函数,由于处理客户消息不是本文的重点,所以不作具体处理,关键点是第66行当有客户断开连接时将客户从客户列表ClientList中移除。

下图是推送消息至客户端的SendMsg函数,这个函数是通过中间件的构造函数新开线程来运行的,从第78行可以看到,只要启动了就会一直执行下去。类MSDataDto(详见下下图)封装了推送至客户端的消息数据,只有两个属性:X,Y。X代表x轴的点,Y代表y轴的点,x,y构成一个坐标点,模拟地图上的经纬度。每次都通过随机数来生成坐标数据,发送给所有已连接到服务器的客户。第93行设定休眠时间,间隔是5到10秒,模拟导航设备发送坐标数据。

以上是websocket中间件的所有功能,接下来是为中间件创建扩展WSMiddlewareExtensions并添加中间件到管道中,下图所示:

接下来是在Startup.Configure的请求处理管道中注册中间件,下图所示:图中红色框起来的代码中,第一个中间件是框架自带的中间件,必须注册。第二个中间件是我们刚刚创建的用于处理websocket请求,也要注册。服务端的工作基本完成。

服务端功能总结

首先创建中间件处理websocket请求,接受客户连接请求并保存客户信息。处理客户发送过来的消息,包括断开连接的消息,删除客户信息。处理导航设备(模拟)发过来的坐标数据并推送给连接到服务器的所有客户。最后将中间件注册到请求管道中。

客户端(浏览器)功能

客户端功能如下图所示:

客户端只需要连接服务器并接收服务器推送的消息,需求比较简单。主要是onmessage函数,接收到服务器的数据后,打印数据并移动模拟的货车行驶,效果如下图所示:

客户端一些问题

由于服务器推送数据的时间是不一定的,客户端移动货车也是需要一定的时间的,所以有可能服务器第一次推送过来的坐标数据客户端还没处理完又一次推送数据过来,客户端就来不及处理了。所以客户端可以考虑通过队列,先把服务器推送过来的数据放到队列里,客户端再一个个的处理队列里的数据,后面介绍通过javascript实现队列功能。

转载请注明:http://www.0431gb208.com/sjslczl/1276.html