문제

클라이언트와 서버가 있습니다.서버를 시작하고 클라이언트를 실행하면 처음에는 제대로 작동합니다.서버를 다시 시작하지 않고 두 번째로 클라이언트를 실행하면 클라이언트가 정지된 것처럼 보입니다.누구든지 무엇이 잘못되었는지 볼 수 있습니까?

나는 클라이언트가 있습니다 :


# 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

그리고 서버:


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

도움이 되었습니까?

해결책

서버에 대한 각 연결을 수신하려면 별도의 수락 호출이 필요합니다.무슨 일이 일어나고 있는지는 첫 번째를 수락하고 작업한 다음 소켓을 청취 상태로 두면서 효과적으로 종료한다는 것입니다.이는 연결이 열리지만 허용되지 않으므로 설명대로 중단됨을 의미합니다.

보다 강력한 서버 프레임워크를 사용하는 것이 더 나을 수도 있습니다.이벤트머신(http://rubyeventmachine.com/) 배우기가 약간 까다롭지만 자체 솔루션을 굴리는 것보다 훨씬 강력합니다.

도움이 될 수 있는 빠른 수정 방법은 다음과 같습니다.

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

이제 수락 호출이 루프로 래핑되어 둘 이상의 연결을 처리할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top