使用webSocket实现对数据的实时推送

在这里插入图片描述

使用webSocket实现对数据的实时推送详解

1.什么是webSocket?

相对于 HTTP 这种非持久的协议来说,websocket是 HTML5 出的一个持久化的协议。

2.实时推送数据的实现方式以及应用场景

实现方式
1.轮询:客户端通过代码定时向服务器发送AJAX请求,服务器接收请求并返回响应信息。
优点:代码相对简单,适用于小型应用。
缺点:在服务器数据没有更新时,会造成请求重复数据,请求无用,浪费带宽和服务器资源。

2.长连接:在页面中嵌入一个隐藏的iframe,将这个隐藏的iframe的属性设置为一个长连接的请求或者xrh请求,服务器通过这种方式往客户端输入数据。
优点:数据实时刷新,请求不会浪费,管理较简洁。
缺点:长时间维护保持一个长连接会增加服务器开销。

3.webSocket:websocket是HTML5开始提供的一种客户端与服务器之间进行通讯的网络技术,通过这种方式可以实现客户端和服务器的长连接,双向实时通讯。
优点:减少资源消耗;实时推送不用等待客户端的请求;减少通信量;
缺点:少部分浏览器不支持,不同浏览器支持的程度和方式都不同

应用场景:聊天室、智慧大屏、消息提醒、股票k线图监控等。

3.代码详解

(1)使用Visual Studio开发工具创建控制台项目,(这里只做数据实时推送演示效果,中间的实际业务代码可根据需求场景来开发)
在这里插入图片描述
(2)使用NuGet包管理器搜索Fleck包,并安装到我们上一步所创建的项目。
在这里插入图片描述
(3)在Main方法下面贴上如下代码,有注释

Console.WriteLine("(1)输入1更新图表数据;");
Console.WriteLine("(2)输入exit退出系统");
//先使用Nuget导入Fleck包 版本要求.net Framework 4.5及以上
FleckLog.Level = LogLevel.Debug;
var allSockets = new List<IWebSocketConnection>();
//监听所有的的地址
var server = new WebSocketServer("ws://0.0.0.0:30000");
server.Start(socket =>
{
    
    
    // onopen:当WebSocket建立网络连接的时候触发该事件
    socket.OnOpen = () =>
    {
    
    
        Console.WriteLine("连接已打开!");
        allSockets.Add(socket);
    };
    // onclose:当WebSocket被关闭的时候触发该事件
    socket.OnClose = () =>
    {
    
    
        Console.WriteLine("连接已关闭!");
        allSockets.Remove(socket);
    };
    // onmessage:当WebSocket接受到远程服务器的数据的时候触发该事件
    socket.OnMessage = message =>
    {
    
    
        Console.WriteLine(message);
        allSockets.ToList().ForEach(s => s.Send("路人甲: " + message));
    };
});
var input = Console.ReadLine();
while (input != "exit")
{
    
    
    foreach (var socket in allSockets.ToList())
    {
    
    
        //send():向远程服务器发送数据
        //socket.Send("路人乙:"+input);
        if (input == "1") {
    
    
            string jsonData = @"{""teamData"":[25,33,15,0,5,10,20],""salesData"":[35,25,18,0,32,22,13]}";
            socket.Send(jsonData);
            Console.WriteLine("发送成功");
        }
    }
    input = Console.ReadLine();
}

(4)构建前端页面,在前端JS配置代码如下,可以在ws.onmessage事件中获取服务器实时推送的数据,可根据业务场景设计页面样式,我这里模拟的是一个智慧大屏的实时推送。

<script type="text/javascript">
    var start = function () {
    
    
        var wsImpl = window.WebSocket || window.MozWebSocket;
        window.ws = new wsImpl('ws://localhost:30000/');
		//接收到消息的回调方法
        ws.onmessage = function (evt) {
    
    
        //evt.data为后台推送数据
            console.log(evt.data);
        };
        //连接成功建立的回调方法
        ws.onopen = function () {
    
    
            //连接已打开
        };
        //连接关闭的回调方法
        ws.onclose = function () {
    
    
            //连接已关闭
        }
    }
    window.onload = start;
</script>

在这里插入图片描述
在这里插入图片描述

4.小结

从上面的案例可以看到,websocket采取的方式是让客户端连接服务器,只要两端进行连接之后,就可以避免多次请求直接发送端对端的数据,不需要经过第三方的转发,只需要客户端和浏览器通过http协议进行一个握手的动作,然后单独建立一条TCP的通信通道进行数据的传送。

文章案例由于前端页面代码太多,就没有全部贴到文章里,有需要的可以在下面留言

猜你喜欢

转载自blog.csdn.net/weixin_42794881/article/details/121951972