3
votes

I'm writing my own SignalR Client on Java and I'm facing some troubles.

At first I want to implement PersistentConnection logic. My server code is taken from example:

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);
    }
}

Judging by .NET client code, I understood that in order to connect to server client should:

1) Send request to http://myserver/battle/negotiate and get ConnectionId from response

2) Send request to http://myserver/battle/connect?transport=longPolling&connectionId=<received_connection_id>

My question is waht should client do to maintain connection? How should it listen to server broadcasting messages?

Another issue is that I receive no response when I'm trying to send message from client to server after connection has been established. I send request to http://myserver/battle/send?transport=longPolling&connectionId=<received_connection_id>. Method OnReceivedAsync is always called, but I get no response (independently of data sent).

I'd be grateful for any explanations on my questions and on internal principles of SignalR work. Thanks in advance.

2
Did you look at the .NET client implementation?davidfowl
@dfowler yes, but I'm new to .NET and it's hard for me to understand C# codeYury Pogrebnyak
Java and .NET are pretty closedavidfowl

2 Answers

4
votes

I've tried to do the same thing that you are doing! I've implemented a SignalR-client for Android and I called it SignalA. :) Have a look at it on github.

1
votes

There are several methods of communication used in SignalR. My understanding is that SignalR will use the best one it determines will work with the given connection.

The general idea behind long polling is this: The client sends a request to the server with a long timeout period. Say 2 minutes or 5 minutes. If the server has a message to send to the client, it then responds to the client request with the message. Otherwise the request will eventually timeout, at which point the client initiates a new request. So, basically, the client is nearly always in a call to the server. The server only ever answers when it has a message for the client. So the client could send the request to the server and say, 90 seconds later, the server gets a message for the client.

For more information, read the Long Polling section of this Wikipedia article: http://en.wikipedia.org/wiki/Push_technology

But for the specifics, you really need to examine the .NET code closely. Hopefully this overview will give you enough to understand what's going on there, though.