我有2个进程在不同的机器上运行,它们通过TCP套接字进行通信.
这两个进程都具有既充当服务器又充当客户端的代码.
即ProcessA打开了一个服务器套接字,它在portX上绑定,ProcessB在portY上打开了一个服务器套接字绑定.
ProcessA打开客户端套接字以连接ProcessB并开始作为客户端发送消息
并接收响应(当然通过相同的tcp连接).
ProcessB一旦收到消息并对其进行处理,它就会发送响应,但也可以通过第二个tcp连接发送消息,即ProcessB已经打开了一个客户端套接字到ProcessA的portX.
因此消息流超过2个不同的tcp连接.
我的问题如下:认为这个“架构”不能改变,必须保持原样:
我有间歇性的问题,消息通过ProcessB已经打开客户端套接字的tcp连接从ProcessB发送到ProcessA,在消息通过ProcessA作为客户端连接的tcp连接从ProcessB发送到ProcessA之前到达processA插座.
即两种流动都会发生
(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不会通过ProcessB将客户端套接字打开到ProcessA的服务器端口X的连接发送消息,之后作为来自ProcessB的服务器端口Y的消息发送到processA?即只有上述的流程(1).
请注意,processB是多线程的,处理非常重要.
更新:
可能是我的误解,但是当进程通过套接字发送数据并且控制权返回给应用程序时,这并不意味着接收方已经接收到数据.
因此,如果进程通过2个套接字发送数据,操作系统是否存在竞争条件?
UPDATE2
回答后我从Vijay Mathew那里得到了:
如果按照建议进行锁定,是否可以保证OS(即IP层)按顺序发送数据?即完成一次传输,然后发送下一个?或者我会将它们复用并具有相同的问题?
谢谢
解决方法:
明显的解决方案是:
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,tcp,networking,sockets,network-programming
来源: https://codeday.me/bug/20190705/1383013.html