簡體   English   中英

雙向讀取數據 TCPServer Ruby

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM