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")

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top