gpt4 book ai didi

ruby - 如何使用 read、readpartial 和 read_nonblock 从 ruby​​ 中的 TCPServer 套接字读取

转载 作者:数据小太阳 更新时间:2023-10-29 07:16:14 26 4
gpt4 key购买 nike

我有一个关于从套接字读取以及如何在 Unicorn 或 Mongrel 等 Ruby 服务器上管理它的两部分问题

  1. 我了解到从套接字读取与读取文件不同,并且没有发送明显的 EOF 消息,数据是无穷无尽的流。那么你怎么知道什么时候停止阅读呢?例如,我的 TCPServer 在这种情况下,当我通过浏览器访问 http://localhost:9799 访问我的服务器时,它在没有更多数据可读后挂起,并且不会抛出 EOFError要么。

require 'socket'

READ_CHUNK = 1024
socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM)
addr = Socket.pack_sockaddr_in(9799, '127.0.0.1')
socket.bind(addr)
socket.listen(Socket::SOMAXCONN)
socket.setsockopt(:SOCKET, :REUSEADDR, true)

puts "Server is listening on port = 9799"
loop do
connection, addr_info = socket.accept
data_buffer = ""

loop do
begin
connection.read_nonblock(READ_CHUNK, data_buffer)
puts "Buffer = #{data_buffer}"
rescue Errno::EAGAIN => e
IO.select([connection])
retry
rescue EOFError
break
end
end
connection.write("HTTP/1.1 200 \r\n")
connection.write("Content-Type: text/html\r\n")
connection.write("Status 200 \r\n")
connection.write("Connection: close \r\n")
connection.write("Hello World \r\n")
connection.close
end

我想知道 Ruby 服务器使用的最佳实践/标准方法是什么。我看到 Unicorn 使用来自 kgio 的 read_nonblock library 和 mongrel 使用 readpartial(我不确定这些,但通过代码,这就是我所采用的方法。)即使检查\r\n 服务器如何知道输入已完成。可以解释应该如何完成(我认为 gets 不是方法 - 它与 readreadpartialread_nonblock).

2).关于如何在 unicorn 或乘客等服务器中实现这一点,我真的很感激

谢谢。

最佳答案

这里是用unicorn做的 https://github.com/defunkt/unicorn/blob/master/lib/unicorn/http_request.rb#L69-L71

add_parse方法(阅读方法上面的注释) https://github.com/defunkt/unicorn/blob/master/ext/unicorn_http/unicorn_http.rl#L760-L778

也可以在这里查看一些解释 http://www.ruby-forum.com/topic/2267632#1014288

这是您使用 http_parser.rb 的工作代码 https://gist.github.com/4136962

gem 安装 http_parser.rb

require 'socket'
require "http/parser"


READ_CHUNK = 1024 * 4
socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM)
addr = Socket.pack_sockaddr_in(9799, '127.0.0.1')
socket.bind(addr)
socket.listen(Socket::SOMAXCONN)
socket.setsockopt(:SOCKET, :REUSEADDR, true)

puts "Server is listening on port = 9799"
loop do
connection, addr_info = socket.accept

parser = Http::Parser.new
begin
data = connection.readpartial(READ_CHUNK)
puts "Buffer = #{data}"
parser << data
end until parser.headers

connection.write("HTTP/1.1 200 \r\n")
connection.write("Content-Type: text/html\r\n")
connection.write("Status 200 \r\n")
connection.write("Connection: close \r\n")
connection.write("\r\n\r\n")
connection.write("Hello World \r\n")
connection.close
end

关于ruby - 如何使用 read、readpartial 和 read_nonblock 从 ruby​​ 中的 TCPServer 套接字读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13533382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com