2012-10-30 56 views
3

我正在Java上編寫自己的SignalR客戶端,並且遇到一些麻煩。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/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工作的內部原理有任何解釋,我將不勝感激。 在此先感謝。

+1

你看看.NET客戶端實現嗎? – davidfowl

+0

@dfowler是的,但我是.NET新手,很難理解C#代碼 –

+2

Java和.NET非常接近 – davidfowl

回答

1

SignalR中有幾種通信方法。我的理解是,SignalR將使用它確定將與給定連接一起工作的最好的一個。

長輪詢背後的一般想法是這樣的:客戶端向服務器發送一個長時間的請求。說2分鐘或5分鐘。如果服務器有一條消息發送給客戶端,則它會通過該消息響應客戶端請求。否則,請求將最終超時,此時客戶端會發起新的請求。所以,基本上,客戶幾乎總是在呼叫服務器。服務器只有在客戶端有消息時纔回答。因此,客戶端可以將請求發送到服務器,並在90秒後說服務器爲客戶端獲取消息。

欲瞭解更多信息,請閱讀這篇維基百科文章的長輪詢部分:http://en.wikipedia.org/wiki/Push_technology

但對於具體細節,你真的需要仔細檢查的.NET代碼。不過,希望這個概述能夠讓你足夠了解那裏發生了什麼。

4

我試過做同樣的事情,你正在做!我已經實現了一個Android的SignalR客戶端,我稱之爲SignalA。 :)看看它在github