Domanda

Ho un server TCP molto di base implementata in Ruby. In generale, si fa quello che si suppone, ma ogni tanto ricevo "La connessione al server è stata reimpostata, mentre la pagina è stata loading" di errore. Ho la sensazione che ha qualcosa a che fare con close terminare la connessione troppo presto. Se sì, come posso attendere che tutti i dati da inviare? O è qualcos'altro?

require 'socket'

server = TCPServer.new('', 80)
loop do
    session = server.accept
    begin
        session.print Time.now
    ensure
        session.close
    end
end
È stato utile?

Soluzione

ho il sospetto che sia perché il browser è in attesa di una risposta HTTP con le intestazioni & c. Curiosamente, è possibile effettuare il "reset" errore capita ogni volta che se si mette davanti al "garantire" un sonno di, diciamo, un secondo.

Come risolvere il problema dipende da che cosa siete dopo. Se questo non è quello di essere un server HTTP, quindi non utilizzare il browser per testarlo. Invece, usare telnet o scrivere un piccolo programma. Se si tratta di essere un server HTTP, allora date un'occhiata a webrick , che viene integrato in rubino MRI> = 1.8. Ecco come:

#!/usr/bin/ruby1.8

require 'webrick'

# This class handles time requests

class TimeServer < WEBrick::HTTPServlet::AbstractServlet

  def do_GET(request, response)
    response.status = 200
    response['Content-Type'] = 'text/plain'
    response.body = Time.now.to_s
  end

end

# Create the server.  There are many other options, if you need them.
server = WEBrick::HTTPServer.new(:Port=>8080)

# Whenever a request comes in for the root page, use TimeServer to handle it
server.mount('/', TimeServer)

# Finally, start the server.  Does not normally return.
server.start

Altri suggerimenti

Io non sono un esperto in questo campo, ma qui è quello che credo che accade ....

Il browser invia una richiesta GET con il campo di intestazione "Connection: keep-alive". Quindi il browser si aspetta di mantenere la connessione viva, almeno fino a quando non riceve un pezzo completo della risposta. In base a questo protocollo, la risposta del server deve includere un'intestazione specifica la lunghezza della risposta, in modo che il browser sa quando ha ricevuto la risposta completa. Dopo questo punto, la connessione può essere chiusa senza la cura del browser.

L'esempio originale chiude la connessione troppo in fretta, prima che il browser può convalidare che una risposta completa è stata ricevuta. Curiosamente, se corro che l'esempio e rinfrescare il mio browser più volte, caricherà circa ogni 1 a 10 tentativi. Forse questo comportamento irregolare è dovuto al browser di tanto in tanto l'esecuzione abbastanza veloce per battere il mio server di chiudere la connessione.

Di seguito è riportato un esempio di codice che esegue costantemente nel mio browser:

require 'socket'

response = %{HTTP/1.1 200 OK
Content-Type: text;charset=utf-8
Content-Length: 12

Hello World!
}

server = TCPServer.open(80)

loop do
  client = server.accept
  client.puts response
  sleep 1
  client.close
end

Inoltre, devono tenere presente che tra cui Connection: close nell'intestazione di risposta non sembra aiutarmi a tutti con questo errore di reset connessione nel mio browser (FFv3.6). Devo includere sia il campo di intestazione content-length, e includono il metodo sleep di mettere un certo ritardo nella chiusura di collegamento al fine di ottenere una risposta coerente nel mio browser.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top