ASP.NET+SignalR聊天室

来源:https://www.cnblogs.com/LiveCoding/archive/2020/07/15/13304130.html
-Advertisement-
Play Games

源碼下載:https://pan.baidu.com/s/1l_XNjpGrrhrx9fz0MXQHLQ 提取碼: pr8q Nuget里搜索安裝SignalR,非ASP.NET CORE版本。 1.增加Startup類 using System; using System.Threading.Ta ...


源碼下載:https://pan.baidu.com/s/1l_XNjpGrrhrx9fz0MXQHLQ  提取碼: pr8q

Nuget里搜索安裝SignalR,非ASP.NET CORE版本。

1.增加Startup類

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(CHATROOM.Startup))]

namespace CHATROOM
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有關如何配置應用程式的詳細信息,請訪問 http://go.microsoft.com/fwlink/?LinkID=316888
            app.MapSignalR();
        }
    }
}
View Code

2.增加繼承自Hub的類

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

namespace CHATROOM
{
    [HubName("CHATROOM")]
    public class BaseHub : Hub
    {
        public static Dictionary<string, string> onlineList = new Dictionary<string, string>();
        public override Task OnConnected()
        {
            string username = Context.QueryString["username"].ToString();
            onlineList.Add(Context.ConnectionId, username);
            Clients.All.onLine(username, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), onlineList.ToList());
            return base.OnConnected();
        }
        public override Task OnDisconnected(bool stopCalled)
        {
            string username = Context.QueryString["username"].ToString();
            onlineList.Remove(Context.ConnectionId);
            Clients.All.offLine(username, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), onlineList.ToList());
            return base.OnDisconnected(stopCalled);
        }
        public void Send(string username, string message, string sendto)
        {
            message = HttpUtility.HtmlEncode(message).Replace("\r\n", "<br/>").Replace("\n", "<br/>");
            if (string.IsNullOrWhiteSpace(sendto))
            {
                Clients.All.receiveMessage(username, message, sendto, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }
            else
            {
                List<string> connids = sendto.Split(',').ToList();
                var st = string.Join(",", onlineList.Where(o => connids.Contains(o.Key)).Select(o => o.Value));
                Clients.Caller.receiveMessage(username, message, st, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                Clients.Clients(connids).receiveMessage(username, message, st, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            }
        }
    }

}
View Code

3.前端代碼

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="CHATROOM.index" %>

<!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-1.6.4.min.js"></script>
    <script src="Scripts/jquery.signalR-2.4.1.min.js"></script>
    <script>
        $(function () {

            var username = $("#lbUsername").text();
            var hub = $.hubConnection();
            hub.qs = { "username": username };
            var chat = hub.createHubProxy("CHATROOM");

            hub.start().done(function () {
                $("#btnSend").click(function () {
                    var username = $("#lbUsername").text();
                    var sendto = $("#lbSendtoUser").attr("connid");
                    var msg = $("#txtMsg").val();
                    if (!username) return;
                    chat.invoke("send", username, msg, sendto)
                    .done(function () {
                        $("#txtMsg").val(""); //發送成功
                    }).fail(function (e) {
                        alert(e); //發送失敗
                    })
                })
            })

            var updateUserlist = function (onlineList) {
                $("#olUserlist").html("");
                for (var i = 0; i < onlineList.length; i++) {
                    var key = onlineList[i]["Key"];
                    var name = onlineList[i]["Value"];
                    var li = '<li class="userItem"><a onclick="selUser(\'' + key + '\', \'' + name + '\')">' + name + '</a></li>';
                    $("#olUserlist").append(li);
                }
            }
            chat.on("onLine", function (username, time, onlineList) {
                $(".msgBox").append("<div><span class='user'>" + username + "</span> 加入群聊 <span class='time'>" + time + "</span></div>");
                $(".msgBox").scrollTop($(".msgBox")[0].scrollHeight);
                updateUserlist(onlineList)
            })
            chat.on("offLine", function (username, time, onlineList) {
                $(".msgBox").append("<div><span class='user'>" + username + "</span> 退出群聊 <span class='time'>" + time + "</span></div>");
                $(".msgBox").scrollTop($(".msgBox")[0].scrollHeight);
                updateUserlist(onlineList)
            })
            chat.on("receiveMessage", function (username, msg, sendto, time) {
                var st = " ";
                if (sendto) st = " <span class='sendto'>@"+sendto+"</span> ";
                $(".msgBox").append("<div><span class='user'>" + username + "</span>" + st + "<span class='time'>" + time + "</span></div>");
                $(".msgBox").append("<div><span>" + msg + "</span></div>");
                $(".msgBox").scrollTop($(".msgBox")[0].scrollHeight);
            })

            $("#btnClear").click(function () {
                $(".msgBox").html("");
            })
            $("#lbSendtoUser").click(function () {
                $("#lbSendtoUser").text("")
            });
        })

        function selUser(key, name) {
            var arr = [];
            var arr1 = [];
            var tolist = $("#lbSendtoUser").text();
            var toconnid = $("#lbSendtoUser").attr("connid");
            if (tolist) {
                arr = tolist.split(',');
                arr1 = toconnid.split(',');
            }
            if ($.inArray(key, arr1) == -1) {
                arr.push(name);
                arr1.push(key);
            }
            else {
                arr.splice(arr.indexOf(name), 1);
                arr1.splice(arr1.indexOf(key), 1);
            }
            $("#lbSendtoUser").text(arr.join(','));
            $("#lbSendtoUser").attr("connid", arr1.join(','));
        }
    </script>
    <style>
        .msgBox {
            height: 380px;
            border: solid 1px #0094ff;
            overflow: auto;
        }
        .msgOper {
        }
        .txtMsg {
            width: 95%;
            height: 100px;
        }
        .user {
            color: forestgreen;
        }
        .sendto {
            color: #0094ff;
        }
        .time {
            color: fuchsia; 
        }
        .divLeft {
            float: left;
            width: 70%;
        }
        .divMid {
            float: left;
            width: 1%;
        }
        .divRight {
            float: left;
            width: 29%;
        }        
        .spliter {
            height: 500px;
        }
        .userList {
            height: 500px;
            border: solid 1px #0094ff;
            overflow: auto;            
        }
        .userItem {
            height: 40px;
            line-height: 40px;
            vertical-align: middle;
            font-size: x-large;
            color: #0094ff;
            background-color: #f5f5f5;
            border-bottom: 1px solid #ff0000;
            cursor: pointer;
        }
        .userItem a{
            width: 100%;
            display: block;
        }
        .lbTo {
            margin-left: 50%;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <div class="divLeft">
                <div class="msgBox" id="msgBox">    
                </div>
                <div class="msgOper">
                    <div>
                        <span>用戶名:</span>
                        <asp:Label ID="lbUsername" runat="server" Text=""></asp:Label>
                        <span class="lbTo">發送給:</span>
                        <span id="lbSendtoUser"></span>
                    </div>
                    <div>
                        <textarea class="txtMsg" id="txtMsg" placeholder="輸入內容..."></textarea>
                    </div>
                    <div>
                        <input type="button" class="btnSend" id="btnSend" value="發    送"/>
                        <input type="button" class="btnClear" id="btnClear" value="清    屏"/>
                        <asp:Button ID="btnQuit" runat="server" Text="退    出" OnClick="btnQuit_Click" />
                    </div>
                </div>
            </div>
            <div class="divMid">
                <div class="spliter"></div>
            </div>
            <div class="divRight">
                <div class="userList">
                    <ol id="olUserlist"></ol>
                </div>
            </div>
        </div>
    </form>
</body>
</html>
View Code

4.效果圖

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 《c++入門經典》筆記11 第十一章 開發高級指針 11.1在堆中創建對象 實際上,類就是對象的類型,對象也是一種變數,所以你可以在堆中創建int型變數,自然也就能創建自定義型變數。 Cat *pCat = new Cat; 這將調用預設構造函數(無參構造函數),每當在堆或棧中創建對象時,都將調用構 ...
  • 《c++入門經典》筆記10 第十章 創建指針 10.1理解指針及其用途 變數是可存儲一個值的對象:整型變數存儲一個數字,字元變數存儲一個字母,而指針是存儲記憶體地址的變數。 電腦記憶體是存儲變數值的地方。根據約定,電腦記憶體被劃分成按順序編號的記憶體單元,每個記憶體單元都有對應的地址。記憶體中,不管其類型是 ...
  • 一、文件基本處理1、什麼是文件 文件是操作系統提供給用戶/應用程式操作硬碟的一個虛擬單位ps:文件是操作系統的概念2、為何要用文件 存取硬碟必須使用文件ps:要永久保存數據就得用文件把數據放進硬碟3、如何用文件 f = open(文件路徑,打開模式) f.write(數據) f.close() 應用 ...
  • 協程使用註意事項 協程內部禁止使用全局變數,以免發生數據錯亂; 協程使用 use 關鍵字引入外部變數到當前作用域禁止使用引用,以免發生數據錯亂; 不能使用類靜態變數 Class::$array / 全局變數 $_array / 全局對象屬性 $object->array / 其他超全局變數 $GLO ...
  • 問題 :最近在項目論壇中,因為要上傳自定義圖片,在做好上傳的前端處理後,在後臺使用move_uploaded_file函數,移動文件的時候,一直返回的是 false; :因為對於這類新加的前端加後臺一起寫的功能,一般是先在本地建一個demo實現,然後在加入到項目中。就在這裡,居然出現一個問題,在前端 ...
  • WPF MVVM 模式下的彈窗,包括確認框和信息提示框,MVVM 模式的用戶控制項。 ...
  • 原理:依賴oracle user_source數據字典,將腳本select出來拼成字元串。 具體實現參考隔壁大佬:https://blog.csdn.net/xiaoqiaoluanwu/article/details/48733781 有了這個轉換的函數,剩下的就是用你習慣的語言把結構select ...
  • 【翻譯】.NET 5中的性能改進 在.NET Core之前的版本中,其實已經在博客中介紹了在該版本中發現的重大性能改進。 從.NET Core 2.0到.NET Core 2.1到.NET Core 3.0的每一篇文章,發現談論越來越多的東西。 然而有趣的是,每次都想知道下一次是否有足夠的意義的改進 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...