[英]Read data both ways TCPServer Ruby
我是 Ruby 的新手,我試圖設置 TCPServer 和客戶端,但我無法將數據從客戶端獲取到服務器,因為由於某種原因,當客戶端連接時,連接在 while 循環內被凍結。 這是代碼:
服務器.rb
require "socket"
server = TCPServer.new 1234
test = ""
loop do
session = server.accept
puts "Entering enter code herewhile loop."
while line = session.gets
puts "Inside while loop"
test << line
end
puts "Finished reading data"
puts "Data recieved - #{test}" # Read data from client
session.write "Time is #{Time.now}" # Send data to clent
session.close
end
客戶端.rb
require "socket"
socket = TCPSocket.open("localhost", 1234)
socket.puts "Sending data.." # Send data to server
while(line = socket.gets)
puts line
end # Print sever response
socket.close
服務器打印一次“內部while循環”,然后由於某種原因它永遠不會打印“完成讀取數據”,直到我手動結束客戶端連接,客戶端結束連接后服務器打印一切正常。 我怎樣才能使這段代碼工作? 謝謝!
IO#gets
是一個阻塞調用。 它等待來自底層 I/O stream 的新行或 stream 的結尾。 (在這種情況下它返回nil
)
在server.rb你有
while line = session.gets
puts "Inside while loop"
test << line
end
session.gets
從您的客戶端讀取一行,打印一些調試信息並將該行附加到test
。 然后它嘗試從客戶端讀取另一行。
但是,您的client.rb不會發送秒行,也不會關閉 stream。 它發送一行:
socket.puts "Sending data.." # Send data to server
然后等待響應:
while(line = socket.gets)
puts line
end
這永遠不會出現,因為服務器正處於while
循環中,等待來自客戶端的更多數據。
您可以通過在發送完所有數據后調用close_write
來解決此問題:
socket.puts "Sending data.." # Send data to server
socket.close_write # Close socket for further writing
調用close_write
而不是close
允許您仍然從套接字讀取。 它還將導致服務器的session.gets
返回nil
,因此它可以退出循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.