gpt4 book ai didi

消息传递的java网络编程协调

转载 作者:可可西里 更新时间:2023-11-01 02:33:02 25 4
gpt4 key购买 nike

我有 2 个进程在不同的机器上运行,它们通过 TCP 套接字进行通信。
这两个进程都有既充当服务器又充当客户端的代码。
IE。 ProcessA 已打开一个绑定(bind)在 portX 的服务器套接字,ProcessB 已打开一个绑定(bind)在 portY 的服务器套接字。
ProcessA 打开一个客户端套接字与 ProcessB 连接并开始作为客户端发送消息并接收响应(当然是通过相同的 TCP 连接)。
ProcessB 一旦接收到消息并对其进行处理,它就会发送响应,但也可以通过第二个 tcp 连接发送消息,即 ProcessB 已打开到 ProcessA 的端口 X 的客户端套接字。
所以消息流通过 2 个不同的 tcp 连接。
我的问题如下:想当然地认为这个“架构”不能改变,必须保持原样:
我有间歇性的问题,消息通过 ProcessB 已打开客户端套接字的 tcp 连接从 ProcessB 发送到 ProcessA,在消息通过 ProcessA 作为客户端连接的 tcp 连接作为响应从 ProcessB 发送到 ProcessA 之前到达 processA套接字。
IE。两种流都发生

(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)

编辑(在请求 ejp 之后)在 ProcessB 的服务器 portY 作为回复发送的消息到达 processA 之前,我如何强制/确保 ProcessB 不通过 ProcessB 的客户端套接字打开到 ProcessA 的服务器 portX 的连接发送消息? IE。只有上面的流程(1)。
请注意,processB 是多线程的,处理过程非常重要。

更新:可能是我的误解,但是当一个进程通过套接字发送数据,并且控制返回给应用程序时,这并不意味着接收方已经接收到数据。因此,如果一个进程通过 2 个套接字发送数据,操作系统是否存在竞争条件?

更新2
从 Vijay Mathew 那里得到回答后:
如果我按照建议进行锁定,是否可以保证操作系统(即 IP 层)按顺序发送数据? IE。完成一个传输,然后发送下一个?或者我会对其进行多路复用并遇到同样的问题吗?

谢谢

最佳答案

显而易见的解决方案是:

LockObject lock;

ProcessA ---->(msg)----> ProcessB(PortY)

// Processing the request and sending its response
// makes a single transaction.
synchronized (lock) {
ProcessB does processing
ProcessB(portY)--->(response)----->ProcessA (TCP1)
}

// While the processing code holds the lock, B is not
// allowed to send a request to A.
synchronized (lock) {
ProcessB--->(msg)----->ProcessA(portX) (TCP2)
}

关于消息传递的java网络编程协调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4212267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com