質問

アプリが1つあります。 「マネージャー」と「ワーカー」で構成されています。現在、労働者は常に接続を開始し、マネージャーに何かを言い、マネージャーは応答を送信します。

マネージャーとワーカーの間には多くのコミュニケーションがあるので、私は2つの間にソケットを開いてコミュニケーションを行うことを検討しています。また、両側からの相互作用を開始したいと考えています。マネージャーがいつでも労働者に何かを言うことを可能にします。

しかし、私は「衝突」に対処する方法について少し混乱しています。たとえば、マネージャーは労働者に何かを言うことを決定し、同時に労働者はマネージャーに何かを言うことにしました。何が起こるか?そのような状況はどのように処理されるべきですか?

PS私は実際の実装にNettyを使用する予定です。

役に立ちましたか?

解決

「私はまた、両側からの相互作用を開始したいと考えています。マネージャーがいつでも労働者に何かを言うことを可能にします。」

簡単な答え。しないでください。

既存のプロトコルから学ぶ:クライアントとサーバーを持っている。物事はうまくいきます。ワーカーはサーバーになることができ、マネージャーはクライアントになることができます。マネージャーは多数のリクエストを行うことができます。労働者は、到着時にリクエストに応答します。

ピアツーピアは、複雑さのための本当の価値はなく、複雑になる可能性があります。

他のヒント

サーバーとクライアントの間の永続的な双方向チャネルに行きます。

あなたが持っているのはだけなら 1 サーバーと 1 クライアント、衝突の問題はありません...サーバーが接続を受け入れると、それがクライアントであることを知っており、その逆も同様です。どちらも同じソケットで読み書きできます。

これで、複数のクライアントがあり、サーバーがクライアントXに特別にリクエストを送信する必要がある場合は、必要です ハンドシェイク!

クライアントが起動すると、サーバーに接続します。この接続が確立されると、クライアントはクライアントX(ハンドシェイクメッセージ)であると識別します。サーバーは、クライアントXにソケットを開いていることを知っており、クライアントXにメッセージを送信する必要があるたびに、そのソケットを再利用します。

幸運なことに、この正確な問題についてチュートリアル(サンプルプロジェクトを含む)を書いたばかりです。 Nettyを使用! :)

これがリンクです: http://bruno.linker45.eu/2010/07/15/handshaking-tutorial-with-netty/

このソリューションでは、サーバーに注意してください ではない クライアントに接続しようとします。サーバーに接続するのは常にクライアントです。メッセージを送信するたびにソケットを開くことを考えていた場合は、接続確立のオーバーヘッドを避けて、データ転送速度をn倍に上げるために、永続的な接続を再考する必要があります。

ソケットで読む必要があると思います。

これらの種類の問題は実際にはありません。...受信と送信の両方を応答的に処理する方法を除いて、一般的にこれは通信をスレッドすることで行われます...アプリに応じて、これに多くのアプローチをとることができます。

Brunodecarvalhoの応答で言及されている握手/ネットチュートリアルへの正しいリンクは http://bruno.factor45.org/blag/2010/07/15/handshaking-tutorial-with-netty/
私は彼の質問にコメントとしてこれを追加しますが、そうするために必要な最小の評判はありません。

ホイールを再発明したいと思っていて、ミドルウェアを使用したくない場合...

プロトコルを設計して、リクエストに対する他のピアの回答が常に他のピアからリクエストと簡単に区別できるようにします。次に、ネットワークI/O戦略を慎重に選択します。ソケットからの読み取りに責任があるコードは、最初に着信データが送信されたデータへの応答であるかどうか、またはピアからの新しいリクエストであるかどうかを判断する必要があります(データのヘッダーを見て、リクエストを発行したかどうか近々)。また、ピアのリクエストに応答を送信すると、発行する新しいリクエストから適切に分離されるように、適切なキューイングを維持する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top