Ruby Tcp Server класс с неблокирующими или многопоточными функциями - PullRequest
3 голосов
/ 01 февраля 2010

Не удается найти какой-либо гем или класс, который может помочь сделать неблокирующий / многопоточный сервер.Где их найти?

Ответы [ 3 ]

6 голосов
/ 02 февраля 2010

Документы Ruby на сокетах имеют довольно неплохие примеры. Используя информацию с этой страницы, я собрал простой клиент и сервер, используя неблокирующие сокеты. В основном это копии кода с этой страницы с некоторыми изменениями.

Простой код сервера (с вызовом accept_nonblock, который может вас заинтересовать):

 require 'socket'
 include Socket::Constants


 socket = Socket.new(AF_INET, SOCK_STREAM, 0)
 sockaddr = Socket.sockaddr_in(6212, 'localhost')
 socket.bind(sockaddr)
 socket.listen(5)
 begin
   client_socket, client_sockaddr = socket.accept_nonblock
 rescue Errno::EAGAIN, Errno::ECONNABORTED, Errno::EINTR, Errno::EWOULDBLOCK
   IO.select([socket])
   retry
 end
 puts client_socket.readline.chomp
 client_socket.puts "hi from the server"
 client_socket.close
 socket.close

И клиент, который говорит с ним:

 require 'socket'
 include Socket::Constants

 socket = Socket.new(AF_INET, SOCK_STREAM, 0)
 sockaddr = Socket.sockaddr_in(6212, 'localhost')
 begin
   socket.connect_nonblock(sockaddr)
 rescue Errno::EINPROGRESS
   IO.select(nil, [socket])
   begin
     socket.connect_nonblock(sockaddr)
   rescue Errno::EINVAL
     retry
   rescue Errno::EISCONN
   end
 end
 socket.write("hi from the client\n")
 results = socket.read
 puts results
 socket.close
5 голосов
/ 01 февраля 2010

Взгляните на EventMachine . Вот быстрый пример:

require "rubygems"
require "eventmachine"

module EchoServer
  def receive_data (data)
    send_data "You said: #{data}"
  end
end

EventMachine::run do
  EventMachine::start_server "0.0.0.0", 5000, EchoServer
end
0 голосов
/ 24 марта 2016

Использование Celluloid::IO

Это основная цель Celluloid::IO, и она чрезвычайно хороша в том, что делает:

Несколько примеров серверов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...