SignalR服务器端消息推送

在传统的HTTP中,只能客户端主动向服务器端发起请求,服务器端是无法主动向客户端发送消息的,但是有一些场景需要我们服务器端主动向客户端发送消息,那么主要有以下3种方式实现

服务器端主动向客户端发送消息的实现方式:

1:轮询
原理: 利用Ajax定时朝后端发送请求,比如每隔五秒钟发一次请求,那么你的数据延迟就可能会高达五秒
特点: 数据延迟,消耗资源过大,请求次数太多

2:长轮询(又叫长连接)
原理: 利用Ajax + 队列  定时朝后端发送请求, 如果没有数据则会阻塞但是不会一直阻塞, 比如阻塞你30秒,还没有数据则返回,然后让客户端浏览器再次发送请求数据的请求
特点: 相对于轮询基本是没有消息延迟的,请求次数降低了很多

3:Websocket
WebSocket 的最大特点就是,浏览器与服务端建立链接之后默认不再断开,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息

Websocket的实现案例

1:浏览器端如实现

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>websocket client</title>
    <script type="text/javascript">
        var start = function () {
            var inc = document.getElementById('incomming');
            var wsImpl = window.WebSocket || window.MozWebSocket;
            var form = document.getElementById('sendForm');
            var input = document.getElementById('sendText');
 
            inc.innerHTML += "connecting to server ..<br/>";
 
            //创建一个新的websocket并连接
            window.ws = new wsImpl('ws://localhost:7181/');
 
            //当数据从服务器返回时,该方法被调用
            ws.onmessage = function (evt) {
                inc.innerHTML += evt.data + '<br/>';
            };
 
            //当成功建立连接时,该方法被调用
            ws.onopen = function () {
                inc.innerHTML += '.. connection open<br/>';
            };
 
            //当连接关闭时,该方法被调用
            ws.onclose = function () {
                inc.innerHTML += '.. connection closed<br/>';
            }
 
            form.addEventListener('submit', function (e) {
                e.preventDefault();
                var val = input.value;
                ws.send(val);
                input.value = "";
            });
 
        }
        window.onload = start;
    </script>
</head>
<body>
    <form id="sendForm">
        <input id="sendText" placeholder="Text to send" />
    </form>
    <pre id="incomming"></pre>
</body>
</html>

2:服务器端我使用的是C#的控制台程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Fleck;   //VS2017->项目->管理NuGet程序包->浏览,输入"fleck", 找到fleck后点击进行安装
 
namespace TopoWebSocket
{
    class Program
    {
        static void Main(string[] args)
        {
            FleckLog.Level = LogLevel.Debug;
            var allSockets = new List<IWebSocketConnection>();
            var server = new WebSocketServer("ws://0.0.0.0:7181");
            server.Start(socket =>
            {
                socket.OnOpen = () =>
                {
                    Console.WriteLine("Open!");
                    allSockets.Add(socket);
                };
                socket.OnClose = () =>
                {
                    Console.WriteLine("Close!");
                    allSockets.Remove(socket);
                };
                socket.OnMessage = message =>
                {
                    Console.WriteLine(message);
                    allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
                };
            });
 
 
            var input = Console.ReadLine();
            while (input != "exit")
            {
                foreach (var socket in allSockets.ToList())
                {
                    socket.Send(input);
                }
                input = Console.ReadLine();
            }
        }
    }
}

注意要引用:using Fleck;

我们来运行下服务器端

客户端如图:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SignalR 是一个 Microsoft 开发的开源实时网络库,它可以让开发者轻松地实现服务器与应用程序之间的实时通信。其中,服务器可以向客户端推送消息,客户端也可以向服务器发送消息。 对于服务器向客户端推送消息SignalR 提供了以下常用的方法: - `Clients.All.SendAsync()`:向所有连接的客户端发送消息。 - `Clients.User(userId).SendAsync()`:向指定用户发送消息。 - `Clients.Group(groupId).SendAsync()`:向指定组中的所有客户端发送消息。 - `Clients.Caller.SendAsync()`:向当前连接的客户端发送消息。 对于客户端向服务器发送消息SignalR 提供了以下方法: - `connection.invoke()`:调用服务器上的方法。 - `connection.send()`:向服务器发送消息。 在使用 SignalR 时,需要在服务器端创建一个 Hub 类,该类继承自 `Microsoft.AspNetCore.SignalR.Hub` 类,并定义需要向客户端推送的方法。在客户端,需要使用 SignalR 客户端库连接到服务器,并订阅服务器推送消息。 示例代码如下: 服务器端: ```csharp using Microsoft.AspNetCore.SignalR; public class ChatHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); } } ``` 客户端: ```javascript var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build(); connection.on("ReceiveMessage", (user, message) => { console.log(user + " says: " + message); }); connection.start().then(() => { console.log("Connected"); connection.invoke("SendMessage", "User1", "Hello"); }).catch((err) => console.error(err.toString())); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值