找不到任何可以帮助制作非阻塞/多线程服务器的gem或类。 哪里可以找到?
答案 0 :(得分:6)
套接字上的Ruby docs有一些很好的例子。使用该页面中的信息,我使用非阻塞套接字拼凑了一个简单的客户端和服务器。这些主要是来自该页面的代码副本,只有一些更改。
您可能感兴趣的简单服务器代码(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
答案 1 :(得分:5)
看看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
答案 2 :(得分:0)
Celluloid::IO
这是Celluloid::IO
的主要目的,它的作用非常好:
一些示例服务器......