Rubin TCPSocket hält Verbindung zu verlieren
Frage
Ich habe einen Client und Server. Ich starten Sie den Server, und der Client ausgeführt werden, und das erste Mal, es funktioniert gut. Das zweite Mal, dass ich den Client ausführen (ohne Neustart des Servers), wird der Client zu hängen. Kann jemand sehen, was falsch ist?
Ich habe einen Klienten:
# Code example originated from p069dtclient.rb at http://rubylearning.com/satishtalim/ruby_socket_programming.html
require 'socket'
x = 0;
streamSock = TCPSocket.new( 'localhost', 20000 )
while x < 10
streamSock.send( "Hello #{x}",0 )
str = streamSock.recv( 100 )
puts "#{x} " + str
x=x+1
end
streamSock.close
Und Server:
# p068dtserver.rb
require "socket"
dts = TCPServer.new('localhost', 20000)
s = dts.accept
print(s, " is accepted\n")
loopCount = 0;
loop do
Thread.start(s) do
loopCount = loopCount + 1
lineRcvd = s.recv(1024)
if ( !lineRcvd.empty? )
puts("#{loopCount} Received: #{lineRcvd}")
s.write(Time.now)
end
end
end
s.close
print(s, " is gone\n")
Lösung
Jede Verbindung zum Server erfordert einen separaten Anruf annehmen, um aufgenommen zu werden. Was passiert, ist, dass Sie die ersten sind zu akzeptieren, die Arbeit mit ihm, und dann endet effektiv, während die Buchse in einem Abhör Zustand verlassen. Dies bedeutet, Verbindungen wird geöffnet, aber nicht akzeptiert, so hängen sie wie Sie beschreiben.
Vielleicht haben Sie besser einen robusteren Server-Framework. Eventmachine ( http://rubyeventmachine.com/ ) ist ein wenig schwierig zu lernen, aber es ist viel mächtiger als ein rollen Sie Ihre eigene Lösung.
Hier ist eine schnelle Lösung, die helfen kann:
require "socket"
dts = TCPServer.new('localhost', 20000)
while (s = dts.accept)
print(s, " is accepted\n")
loopCount = 0;
loop do
Thread.start(s) do
loopCount = loopCount + 1
lineRcvd = s.recv(1024)
if ( !lineRcvd.empty? )
puts("#{loopCount} Received: #{lineRcvd}")
s.write(Time.now)
end
end
end
s.close
print(s, " is gone\n")
end
Nun ist der Anruf annimmt in einer Schleife gewickelt ist so mehr als eine Verbindung verarbeitet werden kann.