2012-10-30 2 views
3

Java에서 내 자신의 SignalR Client를 쓰고 있는데 문제가 있습니다.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-client를 구현했으며 SignalA라고했습니다. :) github에서보세요.

관련 문제