3

私はSignalRの初心者です。SignalR に基づいて基本的なチャット アプリケーションを作成しました。私が直面している問題は、特定のクライアントとメッセージを送信したユーザーにメッセージを送信したいということです。これを行う方法?

特定のクライアントにメッセージを送信するには、次のようにできることを知っています。

Clients.Client(Context.ConnectionId).addMessage(data);

メッセージを送信したクライアントではなく、指定されたクライアントにのみメッセージを送信します。

メッセージが指定されたユーザーに送信されたという誤った信念を与える jQuery を使用して、ユーザー自体にメッセージを追加することもできます。やりたくないこと。

PS: ここで使えdone()ますか? はいの場合、説明してください。

編集

.js ファイル

txtMsg.keypress(function (e) {
   chat.server.send(chatUsername, selectedUsername, txtMsg.val(), showChatName, _invokeChat);
});

chat.client.addMessage = function (chatUsername, message, showChatName, invokeChat) {
    if (invokeChat) {
        selectedUsername = chatUsername;
        _invokeChat = false;
        chatTitleName.text("Chat with: " + selectedUsername);
    }
    if (showChatName) {
        //To show Username with the typed message
        showMessage.append('<b>' + chatUsername + '</b>' + ':&nbsp;' + message + '</br>');
    }
    else {
        //To show only typed message, not the username
        showMessage.append('&nbsp;&nbsp;' + message + '</br>');
    }
    previousUsername = chatUsername;
    //To keep scroll always bottom
    showMessage.scrollTop(showMessage[0].scrollHeight);
};

.cs ファイル( Samir hafez の回答を見て変更)

public void Send(string from, string to, string message, bool blnShowChatName, bool blnInvokeChat)
    {
        string ConnectionID = selectUsername(to);
        // Call the addMessage method on all clients    
        Clients.Client(ConnectionID).addMessage(from, message, blnShowChatName, blnInvokeChat);
        if (!from.Equals(to))
        {
            blnInvokeChat = false;
            Clients.Caller.addMessage(from, message, blnShowChatName, blnInvokeChat);
        }
    }
4

2 に答える 2

3

テキストをサーバーに送り返す必要はありません。javascript を使用してメッセージを追加できます

クライアント

txtMsg.keypress(function (e) {
   chat.server.send(chatUsername, selectedUsername, txtMsg.val(), showChatName, _invokeChat);

   //add this message locally so we don't have to round trip to the server
   addMessage(chatUsername, txtMsg.val(), showChatName, _invokeChat);
});

chat.client.addMessage = addMessage;

function addMessage(chatUsername, message, showChatName, invokeChat) {
    if (invokeChat) {
        selectedUsername = chatUsername;
        _invokeChat = false;
        chatTitleName.text("Chat with: " + selectedUsername);
    }
    if (showChatName) {
        //To show Username with the typed message
        showMessage.append('<b>' + chatUsername + '</b>' + ':&nbsp;' + message + '</br>');
    }
    else {
        //To show only typed message, not the username
        showMessage.append('&nbsp;&nbsp;' + message + '</br>');
    }
        previousUsername = chatUsername;
    //To keep scroll always bottom
    showMessage.scrollTop(showMessage[0].scrollHeight);
};

サーバ

public void Send(string from, string to, string message, bool blnShowChatName, bool blnInvokeChat)
    {
        string ConnectionID = selectUsername(to);
        // Call the addMessage method on all clients    
        Clients.Client(ConnectionID).addMessage(from, message, blnShowChatName, blnInvokeChat);
}

これにより、サーバーコードも簡素化されます...

于 2013-01-05T06:20:21.410 に答える
2

Clients.Caller呼び出し元のクライアントが表示されます。

または、より冗長な方法:Clients.Client(Context.ConnectionId)

これらはすべて、SignalR Wiki for Hubs Hereで入手できます。

于 2013-01-04T11:44:34.787 に答える