双向读取数据 TCPServer Ruby
Read data both ways TCPServer Ruby
我是 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
服务器打印一次“Inside while loop”,然后由于某种原因它从不打印“Finished reading data”,直到我手动结束客户端连接,客户端结束连接后服务器打印一切正常。我怎样才能使这段代码工作?谢谢!
IO#gets
是阻塞调用。它等待来自底层 I/O 流的新行,或流的末尾。 (在这种情况下 returns 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
变为 return nil
,因此它可以跳出循环。
我是 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
服务器打印一次“Inside while loop”,然后由于某种原因它从不打印“Finished reading data”,直到我手动结束客户端连接,客户端结束连接后服务器打印一切正常。我怎样才能使这段代码工作?谢谢!
IO#gets
是阻塞调用。它等待来自底层 I/O 流的新行,或流的末尾。 (在这种情况下 returns 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
变为 return nil
,因此它可以跳出循环。