2つのプロセスがTCPソケット経由で通信している別のマシンで動作しています。
両方のプロセスには、サーバーとしてもクライアントとしても機能するコードがあります。
I. ProcessAがportXでバインドするサーバーソケットを開き、ProcessBがportYでサーバーソケットバインドを開いています。
ProcessAはProcessBに接続してクライアントとしてメッセージを送信するためにクライアントソケットを開きます と応答を受信します(もちろん同じtcp接続を介して)。
ProcessBメッセージを受信して処理すると、応答を送信しますが、2番目のTCP接続、つまりProcessBがProcessAのportXへのクライアントソケットを開いたところでメッセージを送信することもできます。
したがって、メッセージの流れは、2つの異なるtcp接続で行われます。
私の問題は、次のとおりです。は、この「アーキテクチャ」を変更することはできませんし、そのまま滞在しなければならないことを許可されたとして取る:
を私は断続的に、メッセージがProcessBが持っているTCP接続でProcessAにProcessBから送信する問題を抱えていますProcessAがクライアントソケットとして接続したtcp接続を介して、ProcessBからProcessAへの応答としてメッセージが送信される前に、processAに到着します。
I.どちらのフローはメッセージングのJavaネットワークプログラミングコーディネーション
(1)
ProcessA ---->(msg)----> ProcessB(PortY) (TCP1)
ProcessB does processing
ProcessB(portY)--->(response)----->ProcessA (TCP1)
ProcessB--->(msg)----->ProcessA(portX) (TCP2)
(2)
ProcessA ---->(msg)----> ProcessB(PortY) (TCP1)
ProcessB does processing
ProcessB--->(msg)----->ProcessA(portX) (TCP2)
ProcessB(portY)--->(response)----->ProcessA (TCP1)
EDIT(EJP要求の後) どのように私は前に、ProcessBはProcessBがProcessAのサーバーportXにオープンクライアントソケットを持っていることを接続を介してMSGを送信しないことを確認してください/強制することができますが発生しますプロセスBのサーバーportYからの応答としてメッセージがprocessAに到着しましたか?私。上記(1)の流れのみを持つこと。
processBはマルチスレッドであり、処理は簡単ではないことに注意してください。
UPDATE: が、それは私の誤解であるかもしれないが、プロセスはソケット経由でデータを送信し、制御がアプリケーションに返されたときに、これは、受信側がデータを受信したことを意味するものではありません。 プロセスが2つのソケットを介してデータを送信する場合、OSによって競合状態はありますか?
アップデート2
答えた後、私はビジェイマシューから得た:提案として、私はロックをした場合
、OS(すなわち、IP層)の順序でデータを送信することを保証するものではあり?私。 1つの送信を終了し、次に送信しますか?あるいは、彼らは多重化され、同じ問題を抱えていますか?
おかげ
これを明確にすることはできますか?以前の*返信がポートXを経由してAから到着するまで、Bが* next *リクエストをportX経由でAに送信してはならないということを意味しますか?したがって、ポートYはここでは完全に無関係ですか? – EJP
@ejp:2つのtcp接続があります。 Bは、Aによって受信された前のメッセージ(ポートYで聞いていたAからBによって送信された)の応答が受信される前に、AにopenされたportX(Aで開かれた)したがって、portYは無関係ではありません。 Aによる最初のmsgが送信されたのはTCP接続です。 – Cratylus
あなたのパラは「どうすれば保証できますか」ではポートYについて言及していません。それで、あなたはちょうど言ったことに同意しない。これらすべてを同意してください。だから私はポートYに何かを送るべきではないということを集めていますが、ポートYには保留中の返事があります。 – EJP