Asp.Net SignalR - 簡單聊天室實現


簡單聊天室

使用持久鏈接類我們就可以做一些即時通訊的應用了,我使用Group做了一個簡單的聊天室,先上圖技術細節下面再講

image

可以加入聊天室、創建聊天室、發送消息,下面就說說我是如何通過Group做出來的

持久鏈接類有一個Groups的對象,通過這個對象,我們可以進行分組添加人員、發送消息、刪除人員等操作

image

在連接事件中,給當前游客指定隨機名稱,並且返回當前已有的聊天室信息

protected override Task OnConnected(IRequest request, string connectionId)
        {
            var outPut = new OutPut
            {
                ResultType = "RoomList",
                Data = RoomList,
                UserName = $"游客{Rdom.Next(1, 999)}"
            };
            //返回房間信息
            return Connection.Send(connectionId, JsonConvert.SerializeObject(outPut));
        }

下面的代碼做了剩下所有的處理,先從創建聊天室開始講起,如果客戶端的請求Action是createRoom那么當前操作就是創建聊天室,聊天室id是一個隨機生成的Guid,並且把當前的游客添加到當前聊天室中

加入聊天室也是非常簡單的,使用 Groups.Add方法可以輕松的做到,然后再進行廣播給當前聊天室中的所有人推送有新的游客加入

發送消息則是最簡單的了,可以看到最后的發送消息最后一個參數 connectionid,因為是當前人去發送消息 所以把當前人排除掉,給聊天室里的其他所有人發送

protected override Task OnReceived(IRequest request, string connectionId, string data)
        {
            var dto = JsonConvert.DeserializeObject<GroupDto>(data);

            var outPut = new OutPut
            {
                ResultType = "msgResult",
                Data = $"{dto.UserName} : {dto.Data}",
                CurrentRoomId = dto.RoomId
            };

            if (dto.Action.Equals("jionUs"))
            {
                //加入聊天室
                Groups.Add(connectionId, dto.RoomId);
                outPut.Data = $"歡迎{dto.UserName}加入{dto.RoomName}聊天室";
                outPut.CurrentRoomId = dto.RoomId;
                Connection.Send(connectionId, JsonConvert.SerializeObject(outPut));
                return Groups.Send(dto.RoomId, JsonConvert.SerializeObject(outPut));
            }

            if (dto.Action.Equals("createRoom"))
            {
                //創建聊天室
                var room = new Group() { RoomId = Guid.NewGuid().ToString(), RoomName = dto.RoomName };
                Groups.Add(connectionId, room.RoomId);
                dto.RoomId = room.RoomId;
                RoomList.Add(room);
                //返回聊天室列表
                outPut.ResultType = "RoomList";
                outPut.Data = RoomList;
                outPut.CurrentRoomId = dto.RoomId;

                //發送消息
                return Connection.Send(connectionId, JsonConvert.SerializeObject(outPut));

            }
            //發送消息
            return Groups.Send(dto.RoomId, JsonConvert.SerializeObject(outPut), connectionId);
        }


免責聲明!

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



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