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

标签 java sockets networking tcp network-programming

我有 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/

相关文章:

java - 旋转 Android 应用程序的文本和图标

python - 异常值 : (2002, "Can' t 通过套接字 '/var/run/mysqld/mysqld.sock' (111)"连接到本地 MySQL 服务器"

c - 通过 C 中的套接字发送和接收文件

java - 使用任何主机的 IP 地址构造 InetSocketAddress 的正确方法是什么?

ubuntu - 如何通过浏览器 ping vagrant ip 和在 vagrant 上运行的项目

java - Java 中要映射的 DBObject

java - 将 JSF/Seam/JBoss 应用程序升级到新版本

java - 如何在现有的 xml 文件中插入新节点

Python 通过 TCP/IP 读取串行 (RS-232) 数据

java - 通过网络发送数据时触发 Android 事件。检测网络使用情况