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