具有非阻塞或multithreadingfunction的Ruby Tcp Server类
找不到任何可以帮助创建非阻塞/multithreading服务器的gem或类。 哪里可以找到?
套接字上的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
看看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
使用Celluloid::IO
这是Celluloid::IO
的主要目的,它的function非常出色:
一些示例服务器……