無法找到任何可幫助創建非阻塞/多線程服務器的gem或類。 哪裏可以找到?具有無阻塞或多線程功能的Ruby Tcp服務器類
3
A
回答
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
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
0
使用Celluloid::IO
這是Celluloid::IO
的主要用途,它的功能非常好:
幾個例子服務器...
相關問題
- 1. 非阻塞TCP服務器
- 2. TCP多線程服務器
- 3. 具有C套接字和pthreads的多線程TCP服務器 - 爲什麼accept()阻塞第二個請求?
- 4. 無阻塞服務器和線程安全
- 5. boost :: asio多線程異步接受阻塞讀/寫服務器
- 6. 如何使這個非阻塞服務器成爲多線程?
- 7. C中的多線程TCP服務器
- 8. 多線程服務器發送功能
- 9. 阻塞隊列不阻塞線程?
- 10. 多線程與非阻塞套接字
- 11. 線程池與許多阻塞任務
- 12. 多線程TCP服務器python
- 13. 具有空閒連接功能的Akka Tcp服務器
- 14. 無狀態阻塞服務器設計
- 15. 阻塞線程 - Java
- 16. 哪種語言具有更好的線程功能? PHP或Ruby
- 17. 非阻塞多線程MySQL與Java
- 18. 使用OTP原理的非阻塞TCP服務器
- 19. 用於多線程TCP服務器的TCPStream類
- 20. 沒有阻塞線程
- 21. 將線程阻塞轉換爲f中的非線程阻塞#
- 22. 如何使用ssl加密構建非阻塞TCP服務器
- 23. .NET中是否有多線程的TCP服務器套接字?
- 24. 多進程服務器或多線程服務器?
- 25. 發送到所有功能。多線程服務器
- 26. 縮放位圖並上傳到服務器,UI線程阻塞
- 27. Java線程阻塞
- 28. MessageBeep線程阻塞
- 29. Netty線程被阻塞
- 30. 阻止Tomcat中的線程阻塞
可以使用/延遲/:EventMachine.defer(方法(:process_message ),方法(:post_process)) – why 2011-06-16 07:10:51