2

Java DatagramSocket を使用して、データを複数の異なるクライアントにストリーミングしています。現在登録されているクライアントのリストを自分で処理するので、ソケットをサーバー ポートにバインドするだけで、特定のクライアントには接続しません。

ただし、connect() を使用しないと、DatagramSocket が到達不能ポートの ICMP 通知に反応できなくなります。ICMP 通知は、クライアントの 1 つが停止し、サーバーから適切に登録解除する機会が得られない場合に送信されます。

その動作を元に戻す方法はありますか? クライアントごとに 1 つの DatagramSocket を使用することを考えましたが、サーバー上の同じポートにすべてバインドする必要があるため、実現可能ではないようです (私の知る限り、UDP では不可能です)。

私のサーバーが ICMP メッセージを見る保証がないことは承知しており、それを処理するためにある種のタイムアウト メカニズムを実装します。これは、ストリーミング クライアント ユーザーにとって良いことのように思えます。

4

2 に答える 2

1

信頼できるポイントツーポイント接続が必要な場合は、TCPを使用します。

ただし、UDPが必要な場合は、クライアントがハートビートを送信して、パブリッシャーが送信を停止するサブスクライバーをタイムアウトできるようにすることをお勧めします。信頼性の高い接続は必要ないと思いますが、それでもサブスクライバーがパケットをパブリッシャーに送り返す価値はあります。

于 2011-11-14T11:14:50.840 に答える
0

接続されたUDPソケットによってのみスローされる理由は、それが「C」レベルでどのように機能するかであり、その理由、非同期であるため、どのターゲットアドレスが原因であるかを知る方法が他にないためです。 「C」レベルにあるのはerrnoであり、ICMP メッセージ自体の内容ではありません。したがって、「動作を元に戻す」には、接続されたクライアントごとにソケットが必要です。それが現実的でない場合は、アプリケーション ACK の有無に頼るしかありません。

于 2011-11-14T22:32:04.410 に答える