3

Java で独自の 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>

私の質問は、接続を維持するためにクライアントが何をすべきかということです。サーバーブロードキャストメッセージをどのようにリッスンする必要がありますか?

もう 1 つの問題は、接続が確立された後にクライアントからサーバーにメッセージを送信しようとすると、応答がないことです。にリクエストを送信しhttp://myserver/battle/send?transport=longPolling&connectionId=<received_connection_id>ます。メソッドOnReceivedAsyncは常に呼び出されますが、(送信されたデータとは関係なく) 応答がありません。

私の質問と SignalR 作業の内部原則についての説明に感謝します。前もって感謝します。

4

2 に答える 2

4

私はあなたがやっていることと同じことをしようとしました! Android 用の SignalR クライアントを実装し、SignalA と呼びました。:) githubで見てください。

于 2012-12-27T17:47:48.403 に答える
1

SignalR で使用される通信方法はいくつかあります。私の理解では、SignalR は、指定された接続で動作すると判断した最適なものを使用します。

ロング ポーリングの背後にある一般的な考え方は次のとおりです。クライアントは長いタイムアウト時間でサーバーに要求を送信します。2分または5分と言ってください。サーバーがクライアントに送信するメッセージを持っている場合、サーバーはクライアントの要求にメッセージで応答します。そうしないと、リクエストは最終的にタイムアウトになり、その時点でクライアントは新しいリクエストを開始します。したがって、基本的に、クライアントはほぼ常にサーバーへの呼び出しを行っています。サーバーは、クライアントへのメッセージがある場合にのみ応答します。したがって、クライアントはサーバーにリクエストを送信し、90 秒後にサーバーがクライアントへのメッセージを受け取ることができます。

詳細については、このウィキペディアの記事のロング ポーリングのセクションを参照してください: http://en.wikipedia.org/wiki/Push_technology

しかし、詳細については、.NET コードを詳しく調べる必要があります。うまくいけば、この概要がそこで何が起こっているのかを理解するのに十分なものになるでしょう.

于 2012-12-11T14:36:12.263 に答える