質問
私は、クライアントとサーバーを持っています。私は、サーバーを起動して、クライアントを実行し、最初の時間は、それが正常に動作します。私は(サーバを再起動せずに)クライアントを実行して二回目は、クライアントがハングアップしたように表示されます。誰が間違っているかを見ることができますか?
私はクライアントを持っています:
# 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")
解決
サーバへの各接続は、受信するために別個受け入れる呼び出しを必要とします。何が起こっていることは、あなたが、最初の受け入れにして作業し、リスニング状態でソケットを残しながら、効果的に終了していることです。これは、接続が開かれたが、受け入れられていないので、あなたが説明するように、彼らがハングアップされることを意味します。
あなたは、より堅牢なサーバーフレームワークを使用したほうが良いかもしれません。 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
これで受け入れるコールが複数の接続を処理できるようにループに包まれます。
所属していません StackOverflow