3

我正在用 Java 编写自己的 SignalR 客户端,但遇到了一些麻烦。

首先我想实现 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/negotiateConnectionId从响应中获取

2) 发送请求到http://myserver/battle/connect?transport=longPolling&connectionId=<received_connection_id>

我的问题是客户应该做什么来保持连接?它应该如何收听服务器广播消息?

另一个问题是,在建立连接后尝试将消息从客户端发送到服务器时,我没有收到任何响应。我发送请求到http://myserver/battle/send?transport=longPolling&connectionId=<received_connection_id>OnReceivedAsync总是调用方法,但我没有得到响应(与发送的数据无关)。

对于我的问题和 SignalR 工作的内部原则的任何解释,我将不胜感激。提前致谢。

4

2 回答 2

4

我试图做和你一样的事情!我已经为 Android 实现了 SignalR 客户端,我称之为 SignalA。:) 在github上看看。

于 2012-12-27T17:47:48.403 回答
1

SignalR 中使用了多种通信方法。我的理解是 SignalR 将使用它确定将与给定连接一起使用的最佳连接。

长轮询背后的一般思想是:客户端向服务器发送一个请求,超时时间很长。说 2 分钟或 5 分钟。如果服务器有消息要发送给客户端,则它会用该消息响应客户端请求。否则请求最终会超时,此时客户端会发起新的请求。因此,基本上,客户端几乎总是在调用服务器。服务器只有在有消息给客户端时才会回答。所以客户端可以将请求发送到服务器,然后说,90 秒后,服务器会收到一条给客户端的消息。

有关更多信息,请阅读此 Wikipedia 文章的长轮询部分:http ://en.wikipedia.org/wiki/Push_technology

但对于具体细节,您确实需要仔细检查 .NET 代码。不过,希望这个概述能让您充分了解那里发生了什么。

于 2012-12-11T14:36:12.263 回答