SignalR實時通信


/// <summary>
/// Message集線器類
/// </summary>
[HubName("chathub")]
public class ChatHub : Hub
{
    private Broadcaster _broadcaster;
    public ChatHub()
        : this(Broadcaster.Instance)
    {
    }
    public ChatHub(Broadcaster broadcaster)
    {
        _broadcaster = broadcaster;
    }
    /// <summary>
    /// 給所有頁面發送消息
    /// </summary>
    /// <param name="name"></param>
    /// <param name="message"></param>
    public void Send(string name, string message)
    {
        _broadcaster.broadcastMessage(name, message);
    }
    /// <summary>
    /// 給指定頁面發送消息
    /// </summary>
    /// <param name="id"></param>
    /// <param name="message"></param>
    public void Send(int id, string message)
    {
        _broadcaster.broadcastMessage(id, message);
    }
    [HubMethodName("connect")]
    public void Connect(string id)
    {
        var connnectId = Context.ConnectionId;//Value
        if (id != null && connnectId != null)
        {
            SERedisHelper.StringSet(id, connnectId, 10);
        }
    }
}

public class Broadcaster
{
    private readonly static Lazy<Broadcaster> _instance = new Lazy<Broadcaster>(() => new Broadcaster());
    private readonly IHubContext _hubContext;
    public Broadcaster()
    {
        _hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
    }
    public static Broadcaster Instance
    {
        get
        {
            return _instance.Value;
        }
    }
    /// <summary>
    /// 給所有頁面發送消息
    /// </summary>
    /// <param name="name"></param>
    /// <param name="message"></param>
    public void broadcastMessage(string name, string message)
    {
        _hubContext.Clients.All.broadcastMessage(name, message);
    }
    /// <summary>
    /// 給指定頁面發送消息
    /// </summary>
    /// <param name="id"></param>
    /// <param name="message"></param>
    public void broadcastMessage(int id, string message)
    {
        string strValue = SERedisHelper.StringGet(id.ToString());
        BIT.Common.Log.Debug("C# 后台 向客戶端 發送消息的方法strValue:" + strValue);
        if (strValue != null && strValue.Length > 0)
            _hubContext.Clients.Client(strValue).broadcastMessage(message);
    }
}
ChatHub.cs內部代碼
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        #region Redis配置
        //添加redis  / /任何連接或集線器連接和配置應該去這里
        // Redis Server 地址 是正在運行的服務器的名稱
        string ServerString = "";
        if (System.Configuration.ConfigurationManager.AppSettings["RedisServerString"] != null)
        {
            ServerString = System.Configuration.ConfigurationManager.AppSettings["RedisServerString"].ToString();
        }
        int port = 0; // 端口
        if (System.Configuration.ConfigurationManager.AppSettings["RedisServerPort"] != null)
        {
            int.TryParse(System.Configuration.ConfigurationManager.AppSettings["RedisServerPort"].ToString(), out port);
        }
        //是你的在 Redis中定義 定義配置的 密碼。
        string password = "";
        if (System.Configuration.ConfigurationManager.AppSettings["RedisServerPassword"] != null)
        {
            password = System.Configuration.ConfigurationManager.AppSettings["RedisServerPassword"].ToString();
        }
        // SignalR創建一個 Redis,pub / sub通道具有該名稱。
        string appname = "";
        if (System.Configuration.ConfigurationManager.AppSettings["RedisServerAppName"] != null)
        {
            appname = System.Configuration.ConfigurationManager.AppSettings["RedisServerAppName"].ToString();
        }
        RedisScaleoutConfiguration redisScaleoutConfiguration = new RedisScaleoutConfiguration(ServerString, port, password, appname);
        //連接DB,默認為0
        redisScaleoutConfiguration.Database = 3;
        //SignalR用Redis
        GlobalHost.DependencyResolver.UseRedis(redisScaleoutConfiguration);
        #endregion
        // 有關如何配置應用程序的詳細信息,請訪問 http://go.microsoft.com/fwlink/?LinkID=316888
        app.MapSignalR();//啟動SignalR
    }
}
Startup.cs內部代碼-使用redis
<appSettings>
  <!--Redis配置-->
  <add key="RedisServerString" value="localhost" />
  <add key="RedisServerPort" value="6379" />
  <add key="RedisServerPassword" value="" />
  <add key="RedisServerAppName" value="chathub" />
</appSettings>
Web.config配置
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    </div>
        
    </form>
</body>
</html>
發送消息的頁面HTML結構
protected void Button1_Click(object sender, EventArgs e)
{
    Broadcaster.Instance.broadcastMessage(1, "msg");
}
發送消息頁面的后台代碼
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div id="sss">
    
    </div>
        <asp:HiddenField ID="hfID" runat="server" value="1"/>
    </form>
    <script src="../Scripts/jquery-1.6.4.min.js"></script>
    <script src="../Scripts/jquery.signalR-2.2.1.min.js"></script>
    <script src="../signalr/hubs"></script>
    <script type="text/javascript">
        var i = 0;
        $(function () {
            $("#sss").html(i);
            var chat = $.connection.chathub;
            chat.client.broadcastMessage = function (message) {
                i++;
                $("#sss").html(i);
            };


            //日志輸出,以備調試使用
            $.connection.hub.logging = true;

            var id = $("#hfID").val();
            $.connection.hub.start(function () {
                chat.invoke("connect", id);
            });
        });
    </script>
</body>
</html>
接收消息的頁面代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM