我在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 回答
我已经为Android实现了一个SignalR-client,我称之为SignalA . :)看一下github .
SignalR中使用了几种通信方法 . 我的理解是SignalR将使用它确定的最佳方法与给定的连接一起使用 .
长轮询背后的一般思想是这样的:客户端向服务器发送一个具有较长超时时间的请求 . 说2分钟或5分钟 . 如果服务器有要发送到客户端的消息,则它会使用该消息响应客户端请求 . 否则,请求最终会超时,此时客户端会发起新请求 . 所以,基本上,客户端几乎总是在调用服务器 . 服务器只有在有客户端消息时才会回答 . 因此,客户端可以将请求发送到服务器,并说,90秒后,服务器会收到客户端的消息 .
有关更多信息,请阅读此Wikipedia文章的Long Polling部分:http://en.wikipedia.org/wiki/Push_technology
但是对于细节,您确实需要仔细检查.NET代码 . 希望这个概述能让你足够了解那里发生了什么 .