Come prevenire “La connessione è stata reimpostata” errore?
-
30-09-2019 - |
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
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.