SignalR 服务器推送+简易聊天室

 简易聊天室转:忘了...

以下为自动创建代理hub方式

什么时候使用 generated proxy
如果你要给客户端的方法注册多个事件处理器,那么你就不能使用 generated proxy。如果你不使用 generated proxy ,那么你就不能引用 "signalr/hubs" URL。

 

客户端设置
首先需要引用jQuery,SignalR,signalr/hubs
<script src="Scripts/jquery-1.10.2.min.js"></script>
<script src="Scripts/jquery.signalR-2.1.0.min.js"></script>
<script src="signalr/hubs"></script>
 

如何引用动态的 generated proxy
ASP.NET MVC 4 or 5 Razor 

<script src="~/signalr/hubs"></script>
ASP.NET MVC 3 Razor 

<script src="@Url.Content("~/signalr/hubs")"></script>
ASP.NET Web Forms 

<script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script>
/signalr/hubs 是 SignalR 自动生成的,当你启动调试的时候会在Script Documents 看到它

=====================================以下为例子===============================================

1、右键=》添加项目=》OWIN Startup class=》Startup.cs

添加Startup类

using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(Demo_SignalR_2._4._0.Models.Startup))]

namespace Demo_SignalR_2._4._0.Models
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888
            app.MapSignalR();
        }
    }
}

2、右键=》新建项目=》SignalR Hub Class (v2)=》ChatHub.cs

添加ChatHub类

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace Demo_SignalR_2._4._0.Models
{
    [HubName("chat")]
    public class ChatHub : Hub
    {
        public static ConcurrentDictionary<string, string> OnLineUsers = new ConcurrentDictionary<string, string>();

        [HubMethodName("send")]
        public void Send(string message)
        {
            string clientName = OnLineUsers[Context.ConnectionId];
            message = HttpUtility.HtmlEncode(message).Replace("\r\n", "<br/>").Replace("\n", "<br/>");
            Clients.All.receiveMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), clientName, message);
        }

        [HubMethodName("sendOne")]
        public void Send(string toUserId, string message)
        {
            string clientName = OnLineUsers[Context.ConnectionId];
            message = HttpUtility.HtmlEncode(message).Replace("\r\n", "<br/>").Replace("\n", "<br/>");
            Clients.Caller.receiveMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), string.Format("您对 {1}", clientName, OnLineUsers[toUserId]), message);
            Clients.Client(toUserId).receiveMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), string.Format("{0} 对您", clientName), message);
        }
        /// <summary>
        /// 服务器接口推送
        /// </summary>
        /// <param name="message"></param>
        public static void ServerPush(string message)
        {
            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
            context.Clients.All.ServerPush(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message);
        }

        public override System.Threading.Tasks.Task OnConnected()
        {
            string clientName = Context.QueryString["clientName"].ToString();
            OnLineUsers.AddOrUpdate(Context.ConnectionId, clientName, (key, value) => clientName);
            Clients.All.userChange(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), string.Format("{0} 加入了。", clientName), OnLineUsers.ToArray());
            return base.OnConnected();
        }

        public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
        {
            string clientName = Context.QueryString["clientName"].ToString();
            Clients.All.userChange(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), string.Format("{0} 离开了。", clientName), OnLineUsers.ToArray());
            OnLineUsers.TryRemove(Context.ConnectionId, out clientName);
            return base.OnDisconnected(stopCalled);
        }

    }
}

例子:聊天室

创建Index.aspx页

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script src="Scripts/jquery-3.3.1.min.js"></script>
    <script src="Scripts/jquery.signalR-2.4.0.min.js"></script>
  //这个很重要 <script src="signalr/hubs" type="text/javascript"></script> <style type="text/css"> #chatbox { width: 100%; height: 500px; border: 2px solid blue; padding: 5px; margin: 5px 0px; overflow-x: hidden; overflow-y: auto; } .linfo { } .rinfo { text-align: right; } </style> <script type="text/javascript"> $(function () { var clientName = $("#clientname").val(); var eChatBox = $("#chatbox"); var eUsers = $("#users"); var chat = $.connection.chat; $.connection.hub.qs = { "clientName": clientName }; chat.state.test = "test"; //聊天 chat.client.receiveMessage = function (dt, cn, msg) { console.log(dt); console.log(cn); console.log(msg); var clsName = "linfo"; if (cn == clientName || cn.indexOf("您对") >= 0) clsName = "rinfo"; eChatBox.append("<p class='" + clsName + "'>" + dt + " <strong>" + cn + "</strong> 说:<br/>" + msg + "</p>"); eChatBox.scrollTop(eChatBox[0].scrollHeight); } //更新下拉 chat.client.userChange = function (dt, msg, users) { eChatBox.append("<p>" + dt + " " + msg + "</p>"); eUsers.find("option[value!='']").remove(); for (var i = 0; i < users.length; i++) { if (users[i].Value == clientName) continue; eUsers.append("<option value='" + users[i].Key + "'>" + users[i].Value + "</option>") } } //服务器推送 chat.client.ServerPush = function (dt, msg) { eChatBox.append("<p>" + dt + " " + msg + "</p>"); eChatBox.scrollTop(eChatBox[0].scrollHeight); } $.connection.hub.start().done(function () { $("#btnSend").click(function () { var toUserId = eUsers.val(); if (toUserId != "") { chat.server.sendOne(toUserId, $("#message").val()) .done(function () { //alert("发送成功!"); $("#message").val("").focus(); }) .fail(function (e) { alert(e); $("#message").focus(); }); } else { chat.server.send($("#message").val()) .done(function () { //alert("发送成功!"); $("#message").val("").focus(); }) .fail(function (e) { alert(e); $("#message").focus(); }); } }); }); }); </script> </head> <body> <form id="form1" runat="server"> <h3>大众聊天室</h3> <div id="chatbox"> </div> <div> <span>聊天名称:</span> <asp:TextBox ID="clientname" runat="server" ReadOnly="true" style="width:300px;" ></asp:TextBox> <span>聊天对象:</span> <select id="users" name="names"> <% foreach (var item in OnLineUsers) {%> <option value="<%= item.Value %>"><%= item.Text %></option> <%} %> </select> </div> <div> <textarea id="message" name="message" rows="5" style="width: 50%;"></textarea> <input type="button" value="发送消息" id="btnSend" /> </div> </form> </body> </html>

Index.cs

using Demo_SignalR_2._4._0.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo_SignalR_2._4._0
{
    public partial class Index : System.Web.UI.Page
    {
        public List<SelectListItem> OnLineUsers = new List<SelectListItem>();
        protected void Page_Load(object sender, EventArgs e)
        {            
            if (!IsPostBack)
            {   
                clientname.Text = "聊客-" + Guid.NewGuid();
                this.Title = clientname.Text;
            }
            var onLineUserList = ChatHub.OnLineUsers.Select(u => new SelectListItem() { Text = u.Value, Value = u.Key }).ToList();
            onLineUserList.Insert(0, new SelectListItem() { Text = "-所有人-", Value = "" });
            OnLineUsers = onLineUserList;
        }
    }

    public class SelectListItem
    {
        public string Text { get; set; }
        public string Value { get; set; }
    }
}

 

服务器推送:页面 ToServer.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Demo_SignalR_2._4._0
{
    public partial class ToServer : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string msg = Request["msg"];
            if (!string.IsNullOrWhiteSpace(msg))
            {
                Models.ChatHub.ServerPush("服务器端推送接口:" + msg);
            }
        }
    }
}

 

Index.aspx 为简易聊天室    ToServer.aspx 为服务器端接口

转载于:https://www.cnblogs.com/OleRookie/p/10675150.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值