首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCPServer :TCPServer没有看到客户端TCPSocket已经关闭

TCPServer :TCPServer没有看到客户端TCPSocket已经关闭
EN

Stack Overflow用户
提问于 2021-01-24 18:33:23
回答 2查看 144关注 0票数 0

在ruby2.7.0中运行TCPServer时,我想知道我的客户机何时关闭了连接(或无法继续读取)。但是,当我检查服务器时,我从未看到连接已经关闭。

我尝试过使用一组不同的红宝石套接字原语,但是这里似乎没有什么效果。我也尝试过写到套接字,希望能导致错误,但这似乎没有帮助。

我举了一个例子:

代码语言:javascript
复制
# 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)
代码语言:javascript
复制
# 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时,此代码将输出

代码语言:javascript
复制
true

而我希望它能输出:

代码语言:javascript
复制
true
closed
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-15 02:00:58

所提供的唯一答复不起作用。尝试从关闭的套接字读取并没有像我预期的那样出错。

我得出的结论是,我所要求的根本不可能。你必须要么:

  1. 从客户端发送一个保持活动状态,当您没有收到它时关闭它,否则
  2. 将面临不知道您的写作是否成功的后果。

就我个人而言,我能够与2生活,因为这是一个原型。

票数 0
EN

Stack Overflow用户

发布于 2021-01-24 22:22:05

  1. 传递给server.accept的块被忽略,因为Socket#accept不接受块参数。

  1. main.rb中调用socket.close时,关闭连接的客户端。连接的服务器端将保持打开状态。

您可以调用IO#read来等待客户端关闭连接。

Thread.new do server =TCPServer.open(端口)循环do socket = server.accept socket.read放置“客户端关闭连接”socket.eof?#=> true socket.close end

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65874447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档