Как SignalR работает внутри: клиентская сторона

Я пишу свой собственный клиент SignalR на Java, и у меня возникают некоторые проблемы.

Сначала я хочу реализовать логику PersistentConnection. Код моего сервера взят из примера:

public class Battle : PersistentConnection
{
    protected override Task OnConnectedAsync(IRequest request, string connectionId)
    {
        return Connection.Broadcast("Connection " + connectionId + " connected");
    }

    protected override Task OnReconnectedAsync(IRequest request, IEnumerable<string> groups, string clientId)
    {
        return Connection.Broadcast("Client " + clientId + " re-connected");
    }

    protected override Task OnReceivedAsync(IRequest request, string connectionId, string data)
    {
        // return Connection.Broadcast("Connection " + connectionId + " sent ");
        return Connection.Send(connectionId, "Connection " + connectionId + " sent ");  
    }

    protected override Task OnDisconnectAsync(string connectionId)
    {
        return Connection.Broadcast("Connection " + connectionId + " disconncted");
    }

    protected override Task OnErrorAsync(Exception error)
    {
        return Connection.Broadcast("Error occured " + error);
    }
}

Судя по коду клиента .NET, я понял, что для подключения к серверу клиент должен:

1) Отправить запрос на http://myserver/battle/negotiate и получить ConnectionId из ответа

2) Отправить запрос на http://myserver/battle/connect?transport=longPolling&connectionId=<received_connection_id>

Мой вопрос: что должен делать клиент, чтобы поддерживать соединение? Как он должен прослушивать широковещательные сообщения сервера?

Другая проблема заключается в том, что я не получаю ответа, когда пытаюсь отправить сообщение с клиента на сервер после установления соединения. Я отправляю запрос на http://myserver/battle/send?transport=longPolling&connectionId=<received_connection_id>. Всегда вызывается метод OnReceivedAsync, но я не получаю ответа (независимо от отправленных данных).

Буду признателен за любые пояснения по моим вопросам и по внутренним принципам работы SignalR. Заранее спасибо.


person Yury Pogrebnyak    schedule 30.10.2012    source источник
comment
Вы смотрели на реализацию клиента .NET?   -  person davidfowl    schedule 30.10.2012
comment
@dfowler да, но я новичок в .NET, и мне трудно понять код C#   -  person Yury Pogrebnyak    schedule 30.10.2012
comment
Java и .NET довольно близки   -  person davidfowl    schedule 22.11.2012


Ответы (2)


Я пытался сделать то же самое, что и вы! Я реализовал клиент SignalR для Android и назвал его SignalA. :) Взгляните на это на github.

person Erik Z    schedule 27.12.2012

В SignalR используется несколько способов связи. Насколько я понимаю, SignalR будет использовать лучший из них, который, по его мнению, будет работать с данным соединением.

Общая идея длительного опроса такова: клиент отправляет запрос на сервер с длительным периодом ожидания. Скажем, 2 минуты или 5 минут. Если у сервера есть сообщение для отправки клиенту, он отвечает на запрос клиента сообщением. В противном случае запрос в конечном итоге истечет время ожидания, после чего клиент инициирует новый запрос. Таким образом, клиент почти всегда обращается к серверу. Сервер отвечает только тогда, когда у него есть сообщение для клиента. Таким образом, клиент может отправить запрос на сервер и сказать, что через 90 секунд сервер получит сообщение для клиента.

Для получения дополнительной информации прочитайте раздел «Длинный опрос» этой статьи в Википедии: http://en.wikipedia.org/wiki/Push_technology

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

person Pete    schedule 11.12.2012