如何在客户端同步发送和接收帧?
How to synchronize sending and receiving frames on the client side?
如果我发送请求(帧)B并收到响应,而同时我已经在等待前一个请求(A)的响应,B任务中收到的响应实际上是对A的响应要求:
request A sent
request B sent
request B processed (quick)
response B sent
response B received (*)
...
request A processed (slow)
response A sent
response A received
通过简单匹配,我会在 (*) 点得到一个匹配请求 A--响应 B。
那么如何同步呢? IE。我想以响应 A 结束请求 A,并以响应 B 结束请求 B,无论处理每个请求需要多长时间。作为记录,我使用的是经销商路由器套接字。
我正在考虑创建池请求 (Dictionary
),并将任务完成令牌绑定到每个发送的请求。任务在池中创建新插槽,发送请求并等待完成。在后台一直有任务 运行 —— 一个接收者 —— 它只是接收响应,将每个响应放在适当的槽中,并将给定的任务标记设置为已完成。我是在正确的轨道上,还是我错了,或者它已经在 NetMQ 中实现了?
如果您想要同步 request/response 通信,您可以使用 REQ/REP 套接字而不是 DEALER/ROUTER。
如果您想要异步通信并且需要将响应与请求相匹配,您可以在请求中发送唯一的请求 ID,并在响应中return发送此请求 ID。
阅读我的博客中的 AsyncSocket 模式:
http://somdoron.com/2014/08/netmq-asp-net/
它有一个示例,其中包含 TaskCompletionSource、每个请求的序列和字典。
如果我发送请求(帧)B并收到响应,而同时我已经在等待前一个请求(A)的响应,B任务中收到的响应实际上是对A的响应要求:
request A sent
request B sent
request B processed (quick)
response B sent
response B received (*)
...
request A processed (slow)
response A sent
response A received
通过简单匹配,我会在 (*) 点得到一个匹配请求 A--响应 B。
那么如何同步呢? IE。我想以响应 A 结束请求 A,并以响应 B 结束请求 B,无论处理每个请求需要多长时间。作为记录,我使用的是经销商路由器套接字。
我正在考虑创建池请求 (Dictionary
),并将任务完成令牌绑定到每个发送的请求。任务在池中创建新插槽,发送请求并等待完成。在后台一直有任务 运行 —— 一个接收者 —— 它只是接收响应,将每个响应放在适当的槽中,并将给定的任务标记设置为已完成。我是在正确的轨道上,还是我错了,或者它已经在 NetMQ 中实现了?
如果您想要同步 request/response 通信,您可以使用 REQ/REP 套接字而不是 DEALER/ROUTER。
如果您想要异步通信并且需要将响应与请求相匹配,您可以在请求中发送唯一的请求 ID,并在响应中return发送此请求 ID。
阅读我的博客中的 AsyncSocket 模式:
http://somdoron.com/2014/08/netmq-asp-net/
它有一个示例,其中包含 TaskCompletionSource、每个请求的序列和字典。