[英]Ruby TCPSocket keeps losing connection
我有一個客戶端和服務器。 我啟動服務器,並運行客戶端,並且第一次運行良好。 第二次運行客戶端(不重新啟動服務器)時,客戶端似乎掛起。 誰能看到錯在哪里?
我有一個客戶:
# 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
現在,accept調用被包裝在一個循環中,因此可以處理多個連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.