我有一个REQ / REP场景,其中replier使用标准轮询器apis对来自请求者的任何请求进行轮询。 我们有一个ruby实现上面的场景。 我们面临的问题是上述方案仅适用于 ipc 协议,而不适用于 tcp 协议(分别在replier和requester的bind和connect urls中)。 但是,如果我们使用带有发送/接收功能的标准请求者/回复者,则整个过程适用于 tcp 和 ipc 协议。 将replier代码更改为poller实现并且请求者/ replier无法相互通信时会出现问题。
我们还尝试了相应的C ++实现,它似乎适用于tcp / ipc协议和标准/轮询器实现
我想知道代码中是否缺少任何重要部分或某些操作系统设置需要更改以使ruby代码与轮询器实现一起使用?
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 with poller implementation
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