我在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>
发送请求
我的问题是客户端是否应该保持连接?它应该如何收听服务器广播消息?
另一个问题是,当我尝试在建立连接后从客户端向服务器发送消息时,我没有收到任何响应。我向http://myserver/battle/send?transport=longPolling&connectionId=<received_connection_id>
发送请求。始终调用方法OnReceivedAsync
,但我没有得到任何响应(与发送的数据无关)。
对于我的问题和SignalR工作的内部原则的任何解释,我将不胜感激。 提前谢谢。
答案 0 :(得分:4)
我试图做你正在做的事情!我为Android实现了一个SignalR-client,我称之为SignalA。 :)在github上看一下。
答案 1 :(得分:1)
SignalR中使用了几种通信方法。我的理解是SignalR将使用它确定的最佳方法来处理给定的连接。
长轮询背后的一般想法是:客户端向服务器发送一个请求,该请求的超时时间很长。说2分钟或5分钟。如果服务器有要发送到客户端的消息,则它会使用该消息响应客户端请求。否则,请求最终会超时,此时客户端会发起新请求。所以,基本上,客户端几乎总是在调用服务器。服务器只有在有客户端消息时才会回答。因此,客户端可以将请求发送到服务器,并说,90秒后,服务器会收到客户端的消息。
有关更多信息,请阅读此维基百科文章的长轮询部分:http://en.wikipedia.org/wiki/Push_technology
但是对于细节,你真的需要仔细检查.NET代码。希望这个概述能让你足够了解那里发生了什么。