- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有 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/
我想在包含点的主要方法中创建一个数组像 p={(3,8),(2,8)}与这个类 public class Point { private float x,y; public Point
在Elasticsearch中,建议将摄取节点设置为专用节点吗?我打算在k8s集群上运行Elasticsearch,并允许将提取容器安排在也运行其他Java服务容器的工作程序节点上。这是用于生产的良好
我最初的想法是使用管道来协调和控制多个C应用程序,并以shell脚本作为执行程序。假设一个 C 应用程序“A”执行 X,另一个 C 应用程序“B”执行 Y。shell 脚本通过 A 和 B 的 IPC
我在 json 文件中收集了推文集合。我想对它们进行操作,例如根据每个数据条目的时间和坐标对推文进行分组。目前,对于对象坐标,我将它们放在列表数据类型中。与时间和日期类似。所以我已经成功地解析了它们,
我有一个网页,用户应该可以在任何地方输入并跟踪他们的输入。一个问题是 firefox 中的斜线键“/”是打开搜索的快捷方式。这对我来说是不可取的。我还没有找到一种方法来捕获搜索功能并且仍然将输入添加到
我正在尝试使用 d3.dispatch 协调多个 View /控件和 Dispatching Events block 来指导我。然而,我遇到了概念上的障碍。考虑以下 View /控件: 国家/地区下
我在一台计算机上使用 Kaldi 工具集进行语音识别,但我无权修改 /var/kaldi 中的安装内容。该目录包含一个脚本文件夹,作为使用示例提供,这些脚本也彼此紧密链接。 结构如下,数据集mydat
在 C 中,“数组语法”只是指针语法的语法糖。那是a[4] 转换为 *(a+4)。 但这并不总是正确的。 当然下面是荒谬的, int a[4] = {1,2,3,4}; int *(a+4) =
我正在寻找一种方法来协调来自 3 个不同来源的元素。我已经将元素简化为只有一个键(字符串)和版本(长)。 列表是同时获得的(2 个来自单独的数据库查询,1 个来自另一个系统上的内存缓存)。 对于我的最
我开始了解 DDD,并担心从持久性中检索实体对象然后在 UI 的 View 模型中重构它们的性能影响。 假设我有两个聚合根: Person Orders ------ ------
我将 jQuery Flotchart 组件打包为 React 组件,每当组件属性发生更改时,我都需要调用图表实例的 plot 方法。 我最终得到的是 shouldComponentUpdate 钩子
如何在.plist中存储省份、城市和坐标信息?这些信息应该随我的应用程序一起提供。我尝试过以下格式,但不起作用。有没有其他方法可以替代plist?因为plist不利于查询。 ProvinceN
我一直在玩弄 SpriteKit,因为我想在一年内制作一款游戏,但最近我遇到了一些奇怪形式的减速带。 这就是问题所在。 我已经创建了一个常规的 SpriteKit 项目并更改了一些默认代码。我在位置
我有两个数组,在我的 C#/.NET Windows Forms 应用程序中使用 ChartDirector( http://www.advsofteng.com/product.html ) 将它们
我正在查看 article on wikipdia对于这个算法,我看到了两个看似矛盾的说法: "it also gives a deterministic way to check that the
我正在尝试将多个 CABasicAnimations 与 AVAudioPlayer 同步。我遇到的问题是 CABasicAnimation 在安排动画时使用 CACurrentMediaTime()
我们的项目正在使用 gitflow 详情 here我的问题是 QA 如何融入其中。 假设我有一个 master 分支和一个 hotfix 分支。一旦修补程序完成,我相信 QA 应该在修补程序发布时完成
有什么方法可以设置默认的 System.Web.Optimization.ScriptBundle 来生成 source maps对于捆绑和缩小的文件?除了必须在每次构建之前预先生成包和源映射之外,是
有什么方法可以设置默认的 System.Web.Optimization.ScriptBundle 来生成 source maps对于捆绑和缩小的文件?除了必须在每次构建之前预先生成包和源映射之外,是
更新到 Git 2.28 后,我意识到 conditional includes .但是,我无法找到一种方法来为 master(main) 设置不同的 pull reconciliation 选项,而
我是一名优秀的程序员,十分优秀!