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")
해결책
서버에 대한 각 연결을 수신하려면 별도의 수락 호출이 필요합니다.무슨 일이 일어나고 있는지는 첫 번째를 수락하고 작업한 다음 소켓을 청취 상태로 두면서 효과적으로 종료한다는 것입니다.이는 연결이 열리지만 허용되지 않으므로 설명대로 중단됨을 의미합니다.
보다 강력한 서버 프레임워크를 사용하는 것이 더 나을 수도 있습니다.이벤트머신(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
이제 수락 호출이 루프로 래핑되어 둘 이상의 연결을 처리할 수 있습니다.
제휴하지 않습니다 StackOverflow