在ruby2.7.0中运行TCPServer时,我想知道我的客户机何时关闭了连接(或无法继续读取)。但是,当我检查服务器时,我从未看到连接已经关闭。
我尝试过使用一组不同的红宝石套接字原语,但是这里似乎没有什么效果。我也尝试过写到套接字,希望能导致错误,但这似乎没有帮助。
我举了一个例子:
# main.rb
require_relative 'server'
PORT = 9000
server_thread = Server.thread
socket = TCPSocket.open("localhost", PORT)
socket.puts '5'
server_thread.join(1)
socket.close
puts socket.closed?
server_thread.join(2)# server.rb
require 'socket'
class Server
def self.thread
Thread.new do
server = TCPServer.open(PORT)
while true
server.accept do |socket|
while true
socket.puts '1'
# why doesn't this ever happen?
puts 'closed' if socket.closed?
end
end
end
end
end
end运行ruby main.rb时,此代码将输出
true而我希望它能输出:
true
closed发布于 2021-03-15 02:00:58
所提供的唯一答复不起作用。尝试从关闭的套接字读取并没有像我预期的那样出错。
我得出的结论是,我所要求的根本不可能。你必须要么:
就我个人而言,我能够与2生活,因为这是一个原型。
发布于 2021-01-24 22:22:05
server.accept的块被忽略,因为Socket#accept不接受块参数。main.rb中调用socket.close时,关闭连接的客户端。连接的服务器端将保持打开状态。您可以调用IO#read来等待客户端关闭连接。
Thread.new do server =TCPServer.open(端口)循环do socket = server.accept socket.read放置“客户端关闭连接”socket.eof?#=> true socket.close end
https://stackoverflow.com/questions/65874447
复制相似问题