SignalR如何在内部工作:客户端

我在Java上编写自己的SignalR Client,我遇到了一些麻烦 .

首先,我想实现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>

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

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

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

回答(2)

3 years ago

我已经为Android实现了一个SignalR-client,我称之为SignalA . :)看一下github .

3 years ago

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

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

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

但是对于细节,您确实需要仔细检查.NET代码 . 希望这个概述能让你足够了解那里发生了什么 .