3

Java デスクトップ サーバーとそれに接続されている複数の Android クライアントを使用しています。サーバー側では、どのクライアントがソケット TCP/IP によってメッセージを送信したかを識別し、その 1 つのクライアントにのみ応答を送信し、他のクライアントには応答を送信しないようにする必要があります。

クライアントのすべてのソケットを ArrayList に格納します。

最初に、私が試したがうまくいかなかった 2 つの方法を示します。

-- クライアントの IP アドレス。クライアントで socket.getLocalSocketAddress() を呼び出し、サーバーで socket.getRemoteSocketAddress() を呼び出してこれを取得しますが、一致することはありません。たとえば、クライアント XXX.XXX.11.17 とサーバー XXX.XXX.0.13 で取得しましたが、同じ接続では同じであると想定されています。

-- ポート番号。クライアントで getLocalPort() を呼び出し、サーバーで getPort() を呼び出してこれを取得します。はい、これは完全に機能し、番号が一致するため、これを使用できます。ただし、ランダムに選択されたポート番号が2 つの異なるクライアントが同じである可能性があります。可能性は低いですが可能です。つまり、それらが一意であるという保証はありません。

私が使用できる代替手段は何ですか?

4

2 に答える 2

3

どのクライアントがソケット TCP/IP によってメッセージを送信したかを識別し、その 1 つのクライアントにのみ応答を送信し、他のクライアントには応答を送信しないようにする必要があります。

リクエストを受け取ったのと同じソケットに送り返します。

クライアントのパーマネントを識別する必要がある場合は、 の結果を使用できますSocket.getRemoteAddress()

于 2013-02-28T08:33:37.410 に答える
1

クライアントの getLocalSocketAddress() とサーバーの getRemoteSocketAddress() [...] は、同じ接続に対して同じであると想定されています。

いいえ、その間に何があるか分からないからです。ほとんどのモバイル プロバイダーは、プロキシ、NAT などを使用しています。モバイル デバイスは、プロバイダーが提供する LAN (10.0.0.x または 192.168.xx アドレス) 上にあると認識します。複数のクライアントが同じリモート アドレスを持つことも可能です (サーバーから見た場合)。

そうは言っても、サーバーが 1 つの IP、ポート、およびプロトコルをリッスンする場合、リモート IP アドレスとポートを組み合わせることで、サーバー アプリケーション内のクライアントを一意に識別できます。この情報は から入手できますsocket.getRemoteSocketAddress()。返さInetSocketAddressれた (インターネット ソケットの場合) には、リモート IP とポート (それぞれ と ) の両方が含まれgetAddress()ますgetPort()

しかし、他の回答で示されているように、クライアントを識別する方法は本当に必要ありません。ネットワーク クライアント、データを受信するソケットによって識別されるため (ソケットは 2 つのノード間の排他的な接続です)、要求を受信したソケットにデータを送信するだけです。

接続されたクライアントに関する簿記データがさらに必要な場合は、追加情報を含むラッパー クラスでクライアント ソケットをラップします。

于 2013-02-28T08:25:10.640 に答える