我想用Mssql資料庫實作私人聊天系統。這個代碼是公開的,當我發送訊息時,訊息會出現在所有的客戶端。但我想實作一對一的聊天系統。一個用戶輸入存盤在資料庫中的接收者ID和資訊文本,然后發送資訊給接收者。然后訊息會出現在有該接收者ID的接收者訊息區。
以下是我的js代碼
"use strict"/span>。
var connection = new signalR.HubConnectionBuilder().withUrl("/chathub").build()。
//Disable send button until connection is established[/span]。
document.getElementById("sendButton").disabled = true;
connection.start().then(function () {
document.getElementById("sendButton").disabled = false;
}).catch(function (err) {
return console.error(err.toString() )。
});
document.getElementById("sendButton").addEventListener("click", function (event) {
var user = document.getElementById("userInput").value;
var message = document.getElementById("messageInput").value。
connection.invoke("SendMessage"/span>, user, message).catch(function (err) {
return console.error(err.toString())。
});
event.preventDefault()。
});
connection.on("ReceiveMessage"/span>, function (user, message) {
var msg = message.replace(/&/g, "&") 。 replace(/</g, "<").replace(/>/g, ">") 。
var encodedMsg = user ":"/span> msg;
var li = document.createElement("li"/span>)。
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li)。
});
這里是我的樞紐類
using MentorShip.Models。
using Microsoft.AspNetCore.SignalR;
using System.Collections.Generic;
using System.Threading.Tasks;
namespaceMentorShip.Hubs
{
public class SignalRChat: Hub
{
Context c = new Context()。
public async Task SendMessage(string user。string message)。
{
await Clients.All.SendAsync("ReceiveMessage",user,message) 。
}
}
}
下面是我的HTML代碼
<div class="container"/span>>
<div class="row"> </div>
<div class="row">
<div id="connectionId"> </div>
<div class="col-2"> Receiver Id</div>
<div class="col-4"><input type="text" id="userInput" /> </div>
</div>
<div class="row">
<div class="col-2"> Message</div>
<div class="col-4"><input type="text" id=" messageInput" /></div>
</div>
<div class="row"> </div>
<div class="row">
<div class="col-6"/span>>
<input type="button" id="sendButton" value="Send Message" />
</div>
</div>
</div>
<div class="row">
<div class="col-12"/span>>
<hr />
</div>
</div>
<div class="row">
<div class="col-6">
<ul id=" messagesList"></ul>
</div>
</div>
</div>
uj5u.com熱心網友回復:
要向特定的用戶發送訊息,你可以使用以下方法:
使用單用戶組。
您可以為每個用戶創建一個組,然后在您想只聯系該用戶時向該組發送訊息。每個組的名稱就是用戶的名稱。如果一個用戶有一個以上的連接,每個連接ID都會被添加到該用戶的組中。
通過ConnectionID發送訊息。
從上面的示例代碼中,在OnConnectedAsyc方法中,我們可以獲得ConnectId和User Name,然后,你可以將它們存盤在資料庫中。然后,你可以在ChatHub.cs中添加SendMessageToUser方法。在這個方法中,你可以查詢資料庫并根據接收者的名字找到connectId,然后使用Clients.Client("connectionId").SendAsync()方法來發送訊息給特定的用戶。
public Task SendMessageToUser(string sender, string receiver, string message)
{
//基于接收器的名稱查詢資料庫并獲得連接ID。
return Clients.Client("connectionId").SendAsync("ReceiveMessage", sender, message) 。
}
下面是一些相關的文章,你可以參考一下:
添加SignalR客戶端庫
創建一個 SignalR 中心。
在專案檔案夾中,創建一個Hubs檔案夾,并添加一個ChatHub.cs檔案,代碼如下:
namespace SignalRApp.Hubs
{
//require using Microsoft.AspNetCore.SignalR;
//require using Microsoft.AspNetCore.Authorization;
[]。
public class ChatHub : Hub
{
public override Task OnConnectedAsync()
{
Groups.AddToGroupAsync(Context.ConnectionId, Context.User.Identity.Name)。
return base.OnConnectedAsync()。
}
public async Task SendMessage(string user, string message)。
{
await Clients.All.SendAsync("ReceiveMessage", user, message) 。
}
public Task SendMessageToGroup(string sender, string receiver, string message)。
{
return Clients.Group(receiver).SendAsync("ReceiveMessage"/span>, sender, message)。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/320340.html
標籤:
上一篇:屬性'PropertyName'無法被映射,因為它的型別是'object',而這不是一個支持的原始型別或有效的物體型別。



