0

クライアント アプリとサーバー アプリの間で 2 つの NSStreams ペア (入力/出力) を開いています。これら 2 つのストリームを同じサーバー側オブジェクトに関連付ける必要があります。2 ストリーム アプローチは、didAcceptConnectionWithInputStream が 2 回呼び出されることを意味します。クライアントからの各ストリーム オープン コマンドに対して 1 回です。両方の open コマンドは、一方が他方の直後に順次実行されます。2 つのオープンが連携してサーバー側でペアリングされることを利用してみましたが、2 つの異なるクライアントが同時に接続しようとすると、競合状態とストリームの混乱の問題が確実にあります。

サービスに接続するときに送信できるキーと値のペアがあれば完璧で、クライアントを識別するためにクライアント生成の GUID を送信できます。

IP アドレスによる識別は、クライアントがローカル ネットワーク上にある (NAT をトラバースする必要がない) ため可能な解決策ですが、NSNetService で実装するのは複雑に思えます。

4

1 に答える 1

0

上記のコメントの Paulw11 は、オプションを整理するのに役立ちました。私は次の方法で問題を解決しました:

各着信ストリーム要求 (つまり、入力ストリームと出力ストリームのペア) の一時ホルダーとして機能するクラス PendingStream を作成し、それをすべての PendingStream オブジェクトを保持するセットに追加します。PendingStream はストリーミングのデリゲートとして設定されているため、入力ストリームでクライアントから受信データを受け取ることができます。その後、クライアントは識別子を送信し、その識別子も PendingStream のプロパティとして格納されます。識別子がクライアントから到着するたびに、PendingStream はそれを作成した元のオブジェクト (デリゲート) にコールバックして、PendingStreams のセットを反復処理し、クライアント識別子に基づいて識別されたストリームのペアを照合できるようにします。一致が見つかると、PendingStream オブジェクトがセットから削除され、ストリーム ペアが必要な場所に再割り当てされます。

タイマーベースのアプローチを使用して、PendingStream オーファン (一致する 2 つのストリーム要求のうちの 1 つだけが到着した) がないようにします。

私が望むよりも少し複雑で複雑ですが、うまく機能します。

于 2015-12-12T16:34:30.587 に答える