2012-11-23 10 views
5

मैं सॉकेट से पढ़ने पर एक 2 भाग सवाल है और कैसेकैसे उपयोग कर, पढ़ readpartial रूबी में एक TCPServer सॉकेट से पढ़ सकते हैं और read_nonblock

  1. मैंने सीखा है यह यूनिकॉर्न या संकर जाति की तरह रूबी सर्वर पर प्रबंधित करने के लिए कि सॉकेट से पढ़ने के लिए एक फ़ाइल पढ़ने से अलग है और कोई विशिष्ट ईओएफ संदेश नहीं भेजा गया है और डेटा एक अंतहीन धारा है। तो आप कैसे पढ़ना बंद करना जानते हैं? इस मामले में जब मैं किसी ब्राउज़र से http://localhost:9799 तक पहुंच कर अपने सर्वर हिट में उदाहरण के लिए मेरे TCPServer, यह लटका हुआ है के बाद वहाँ पढ़ने के लिए कोई और अधिक डेटा और यह या तो 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 
 

मैं जानना चाहते हैं क्या सबसे अच्छा अभ्यास/मानक रूबी सर्वर द्वारा इस्तेमाल किया दृष्टिकोण। मुझे लगता है कि यूनिकॉर्न kgio लाइब्रेरी से read_nonblock का उपयोग करता है और मैंग्रेल रीडपार्टियल का उपयोग करता है (मुझे इनके बारे में निश्चित नहीं है लेकिन कोड के माध्यम से जा रहा है यह मुझे लगता है कि दृष्टिकोण अपनाया गया है।) \ R \ n के लिए चेक के साथ भी सर्वर कैसे जानता है इनपुट पूरा हो गया है। समझा सकते हैं कि यह कैसे किया जाना चाहिए (और मुझे लगता है कि gets दृष्टिकोण नहीं है - अपने read, readpartial, read_nonblock के साथ)।

2)। मैं वास्तव में यह कैसे गेंडा या यात्री

धन्यवाद की तरह सर्वर में हासिल की है पर कुछ लाइनें की सराहना करेंगे।

उत्तर

5

यह यहाँ 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

का उपयोग कर

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

प्रतिक्रिया के लिए धन्यवाद और मुझे http_parser.rb पर परिचय देना। किसी भी सर्वर के बारे में जानें जो पार्सर लाइब्रेरी का उपयोग नहीं करता है और किसी अन्य दृष्टिकोण का चयन करता है? – Sid

+0

मैं सर्वर पारसर्स का उपयोग नहीं करते पता नहीं है, एक और दृष्टिकोण की किस तरह? – Shtirlic

+0

इम खेद है कि मैं क्या मतलब सर्वर http_parser.rb पुस्तकालय का उपयोग नहीं करते थे। – Sid

संबंधित मुद्दे