【问题标题】:Read data both ways TCPServer Ruby双向读取数据 TCPServer Ruby
【发布时间】:2021-05-28 00:36:47
【问题描述】:

我是 Ruby 的新手,我正在尝试设置 TCPServer 和客户端,但我无法将数据从客户端获取到服务器,因为由于某种原因,当客户端连接时,连接在 while 循环内被冻结。 代码如下:

server.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

client.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循环”,然后由于某种原因它永远不会打印“完成读取数据”,直到我手动结束客户端连接,客户端结束连接后服务器打印一切正常。我怎样才能使这段代码工作?谢谢!

【问题讨论】:

  • gets 的返回值始终为真,因此 while 循环将永远运行。

标签: ruby tcp connection tcpserver tcpsocket


【解决方案1】:

IO#gets 是一个阻塞调用。它等待来自底层 I/O 流的新行或流的结尾。 (在这种情况下它返回nil

server.rb 你有

while line = session.gets
  puts "Inside while loop"
  test << line
end

session.gets 从您的客户端读取一行,打印一些调试信息并将该行附加到test。然后它会尝试从客户端读取另一行

您的 client.rb 但是从不发送秒行,也不会关闭流。它发送一行:

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,因此它可以退出循环。

【讨论】:

  • 哦,非常感谢您的帮助!我不知道是什么原因造成的。我仍然不明白为什么它会卡在while循环中,我认为在socket.gets读取客户端发送的行之后,当它尝试在下一次迭代中再次执行socket.gets时,它会返回nil并因此退出在 while 循环中,如果客户端没有发送任何内容,socket.gets 是否不会返回 nil?
  • @SantiArias 服务器无法判断该行是否是最后一行,或者是否会有更多行到达。只要流打开,客户端可以发送更多行。这就是为什么(如果没有可用的线路)gets 等待一个。它只在流的末尾返回nil,即当客户端关闭其“写端”时。
  • 好的,再次感谢您,您的帮助很大!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2022-01-15
相关资源
最近更新 更多