2010-02-01 46 views

回答

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 
+0

可以使用/延遲/:EventMachine.defer(方法(:process_message ),方法(:post_process)) – why 2011-06-16 07:10:51

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