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")
Решение
Для каждого подключения к серверу требуется отдельный вызов accept, чтобы быть принятым.Что происходит, так это то, что вы принимаете первое, работаете с ним, а затем эффективно завершаете работу, оставляя сокет в состоянии прослушивания.Это означает, что соединения будут открыты, но не приняты, поэтому они зависают, как вы описываете.
Возможно, вам было бы лучше использовать более надежную серверную платформу.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
Теперь вызов accept заключен в цикл, так что может быть обработано более одного соединения.