Pergunta

Eu tenho um cliente e servidor. Eu iniciar o servidor e executar o cliente, ea primeira vez que ele funciona bem. A segunda vez que executar o cliente (sem reiniciar o servidor), o cliente parece travar. qualquer um pode ver o que está errado?

Eu tenho um cliente:


# 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

E servidor:


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

Foi útil?

Solução

Cada conexão com o servidor requer um separado aceitar chamada, a fim de ser recebido. O que está acontecendo é que você está aceitando o primeiro, de trabalhar com ele, e, em seguida, efetivamente terminando deixando o soquete em um estado de escuta. Este conexões via serão abertos, mas não aceitos, assim que pendurar como você descreve.

Você pode ser melhor fora de usar uma estrutura de servidor mais robusto. EventMachine ( http://rubyeventmachine.com/ ) é um pouco complicado para aprender, mas é muito mais poderoso do que um rolar sua própria solução.

Aqui está uma solução rápida que pode ajudar:

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

Chamada Agora a aceitar é envolto em um loop para mais de uma conexão pode ser processado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top