Несколько номеров SignalR чат

Я планирую создать приложение чата, и я читал, что помощью SignalR - Это одна из лучших технологий для применения.

Я видел примеры этого,но у них есть только один чат.

Я хочу иметь несколько чатов. Пользователь просто выберет один из этих чатов.

хотя я новичок, я думаю, чтобы создать один чат в SignalR это:

<script type="text/javascript">
    $(function () {
        var connection = $.connection.communicator;
        connection.receive = function (from, msg) {
            $("#chatWindow").append("<li>" + from + ": " + msg + "</li>");
        };
        $.connection.hub.start();

        $("#btnSend").click(function () {
            connection.broadcast($("#txtName").val(), $("#txtMsg").val());
        });
    });
</script>

var connection = одноместный чат (я не конечно)

поэтому, если у меня много соединений (например, connection1, connection2, connection3....) Я могу иметь несколько чатов?

еще раз, я не уверен, что это правильно... Пожалуйста, помогите мне о том, как реализовать несколько чатов...

(PS: Я видел JABBR, но его код заставляет мой нос кровоточить. Вы можете привести простые примеры?)

3 ответов


вам не нужно открывать несколько соединений, только одно, но использовать Group:

public class MyHub : Hub, IDisconnect
{
    public Task Join()
    {
        return Groups.Add(Context.ConnectionId, "foo");
    }

    public Task Send(string message)
    {
        return Clients["foo"].addMessage(message);
    }

    public Task Disconnect()
    {
        return Clients["foo"].leave(Context.ConnectionId);
    }
}

одна группа означает одну комнату, поэтому каждый раз, когда один пользователь присоединяется к одной комнате, вы просто добавляете этого пользователя в группу этой комнаты, и когда вы хотите транслировать сообщение, просто отправьте сообщение клиентам в группе.

более детально: https://github.com/SignalR/SignalR/wiki/Hubs


- ладно... Вот самый простой способ сделать несколько комнат:

$(function () {
    var chat = jQuery.connection.chat;

    chat.addMessage = function (message, room) {

        if ($('#currentRoom').val() == room) {
            $('#messagesList').append('<li>' + message + '</li>');
        }
    };

    chat.send($('#textboxMessage').val(), $('#currentRoom').val());
    $('#textboxMessage').val("");

    $.connection.hub.start();
});


public class Chat : Hub
{
   public void Send(string msg, string room)
   {
       Clients.addMessage(msg, room);
   }
}

у меня есть выпадающий список доступных комнат, и выбранная комната будет значением элемента, скажем, текстовое поле:

 <input type="text" readonly="readonly" id="currentRoom" />

Теперь, каждый раз .отправить называется, мы передадим не только сообщение, но и текущую комнату...

The .addMessage вернет каждому клиенту два значения: одно-сообщение, другое-комната... Теперь мы сравним возвращенную "комнату" с текущий номер клиента. Как только они совпадут, сообщение будет отображаться в этой текущей комнате:

if ($('#currentRoom').val() == room) {
    $('#messagesList').append('<li>' + message + '</li>');
}

вам не нужно несколько соединений. Просто используйте один и поместите метаданные в возвращенное сообщение JSON о том, для какой комнаты предназначено сообщение. Затем код JavaScript должен направить сообщение в нужную комнату.