2009-09-21 6 views
0

클라이언트와 서버가 있습니다. 서버를 시작하고 클라이언트를 실행하면 처음에는 제대로 작동합니다. 서버를 다시 시작하지 않고 클라이언트를 두 번째로 실행하면 클라이언트가 멈춘 것처럼 보입니다. 누구든지 잘못된 것을 볼 수 있습니까?Ruby TCPSocket 연결이 끊어지지 않습니다.

 

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

답변

2

서버에 각 연결을 위해 수신 할 수있는 별도의 동의를 호출을 필요로

나는 클라이언트가 있습니다. 무슨 일이 일어나고 있는지 처음으로 동의하고, 함께 작업 한 다음 소켓을 청취 상태로 두면서 효과적으로 종료하는 것입니다. 즉, 연결은 열리지 만 받아 들여지지는 않으므로 사용자가 설명하는대로 연결됩니다.

더 강력한 서버 프레임 워크를 사용하는 것이 더 나을 것 같습니다. EventMachine (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 

을 더 이상 연결을 처리 할 수 ​​있도록 전화가 루프에 싸여 동의 :

여기에 도움이 될 수 있습니다 빠른 수정합니다.

관련 문제