ZMQ轮询器实现不使用TCP,但使用IPC

时间:2016-05-31 09:06:20

标签: ruby sockets tcp zeromq rhel7

我有一个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

0 个答案:

没有答案