我有一个 REQ/REP 场景,其中回复者使用标准轮询器 API 不断轮询来自请求者的任何请求。我们有上述场景的红宝石实现。我们面临的问题是上述场景仅适用于ipc协议而不适用于tcp协议(分别在回复者和请求者的绑定和连接 url 中)。但是,如果我们使用带有发送/接收功能的标准请求者/回复者,那么整个过程都适用于tcp和ipc协议。该问题发生在将应答器代码更改为轮询器实现并且请求者/应答器无法相互通信时。
我们还尝试了相应的 C++ 实现,它似乎适用于 tcp/ipc 协议和标准/轮询器实现
我想知道代码中是否缺少任何重要部分或需要更改某些操作系统设置以使 ruby 代码与轮询器实现一起使用?
红宝石实施
请求者
require 'rubygems'
require 'ffi-rzmq'
context = ZMQ::Context.new
puts "Connecting to the Server..."
requester = context.socket(ZMQ::REQ)
requester.connect("tcp://localhost:5555")
puts "Calling server"
requester.send_string 'Shiraaz'
puts 'After send'
reply = ''
requester.recv_string(reply)
puts 'After receieve'
puts reply
具有标准接收/发送实现的 REPLIER
require 'rubygems'
require 'ffi-rzmq'
context = ZMQ::Context.new
puts "Connecting to the Server..."
requester = context.socket(ZMQ::REQ)
requester.connect("tcp://localhost:5555")
puts "Calling server"
requester.send_string 'Shiraaz'
puts 'After send'
reply = ''
requester.recv_string(reply)
puts 'After receieve'
puts reply
带有轮询器实现的 REPLIER
require 'rubygems'
require 'ffi-rzmq'
puts "Starting Server..."
context = ZMQ::Context.new
socket = context.socket(ZMQ::REP)
socket.bind("tcp://localhost:5555") //This does not works...But changing it to socket.bind("ipc:///tmp/feed") and making the same change in the requester connect url makes it work
poller = ZMQ::Poller.new
poller.register(socket, ZMQ::POLLIN)
loop do
puts 'Before poll'
poller.poll(1000)
request = ''
puts 'After poll'
poller.readables.each do |sock|
puts 'here'
if sock === socket
sock.recv_string(request)
puts "Received request. Data: #{request.inspect}"
sock.send_string('Reply from the server')
end
end
end