草庐IT

Java TCP Socket等待空闲?

coder 2023-09-19 原文

我不确定这是一个 Java 问题还是 TCP 问题或两者兼而有之:

我有一些使用 Apache Mina 的服务器代码,它运行一个在给定套接字上监听 TCP 的服务器。我的处理程序扩展了 IoHandlerAdapter。我正在使用它通过 HTTP/1.1 将相机连接到 Java 服务器

问题是:如果我建立连接然后完全断开相机(拉电源或拉网络),我必须等到调用 sessionIdle 方法来检测 session 现在已经死了(然后明确关闭来自服务器端的 session )。

我的问题是:有没有办法知道客户端立即中断了 TCP session ?或者这只是 TCP session /Mina 的工作方式?

理想情况下,sessionIdle 仅适用于 TCP 套接字尚未终止但客户端(相机)已停止通过套接字通话的情况......当套接字实际被终止时(由客户端),其他一些机制会捕获/网络)。

注意:我正在覆盖 exceptionCaught() 但我没有看到在我拔掉电源或网络的情况下被调用。它只是等待空闲时间,然后调用 sessionIdle()。

谢谢!

最佳答案

不幸的是,连接一端的突然移除无法立即检测到,因为被移除的一端没有机会通知连接的另一端。

没有字符串(可以这么说)连接 TCP 连接的两端,而只是关于连接状态的约定。结果是,在达到超时之前,没有办法知道连接的另一端已经消失,除非连接的那端发送其打算断开连接的通知。

打个比方,假设您正在另一个房间里与您看不见的人进行对话。你什么时候认为他们不再存在?如果他们告诉你他们要走了,然后你听到关门声,就可以合理地假设他们已经离开了。但是,如果他们只是没有回答一个问题,您可能会重复这个问题,这次可能会大声一点。然后你可能会等一会儿,叫他们的名字,也许再等一会儿等待回应,然后也许最后走到另一个房间,看看他们是否还在那里。

这就是 TCP 基本上做的事情(特别是如果你正在发送保持 Activity ),除了它没有办法走到另一个房间并且只能依靠达到超时阈值来指示对方已经离开。因此,当超时而另一方没有响应时,就会假设他们没有告诉你就离开了。

这就是为什么当连接的另一端突然消失时,您必须依靠超时来通知您,因为没有其他方法可以知道。

关于Java TCP Socket等待空闲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33178388/

有关Java TCP Socket等待空闲?的更多相关文章

  1. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  2. ruby - Watir ... sleep 和等待之间的区别 - 2

    有什么显着的区别吗sleep10和wait_until(10)他们似乎都在做同样的事情:WAITING10秒,然后继续下一步 最佳答案 sleep在指定时间内什么都不做。wait_untiltakesablock.它一直等到block评估为真或超时。如果没有给出block,它们的行为相同。 关于ruby-Watir...sleep和等待之间的区别,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/que

  3. ruby - 如何让 Selenium/Ruby 机器人在执行操作之前等待? - 2

    我正在构建一个点击元素的Selenium/Ruby网络机器人。问题是,有时在机器人决定找不到元素之前没有足够的时间加载页面。让Selenium在执行操作之前等待的Ruby方法是什么?我更喜欢显式等待,但我也接受隐式等待。我尝试使用wait.until方法:require"selenium-webdriver"require"nokogiri"driver=Selenium::WebDriver.for:chromewait=Selenium::WebDriver::Wait.new(:timeout=>15)driver.navigate.to"http://google.com"dr

  4. ruby - 如何等待 Selenium 中的页面重定向? - 2

    我正在尝试执行一项相对简单的任务:WAITING页面重定向完成。刚刚看到another回答了有关该主题的问题,建议是等待后一页上的特定文本出现(如果我做对了)。如果是这样,等到window.location发生变化怎么样?好点吗?更差?不太适用?还有其他想法吗?只是好奇,如果需要,可以将此问题标记为社区wiki。谢谢! 最佳答案 是的,我在使用Selenium时遇到过很多次这个问题。我有两种方法解决这个问题。首先,您实际上可以更改隐式等待时间。例如给定这段代码:Actionsbuilder=newActions(driver);bu

  5. ruby - Puppet 等待服务准备就绪 - 2

    我正在使用Puppet进行机器配置。我有一个服务在Tomcat6应用程序服务器中运行,另一个list依赖于该服务(发送一些REST请求作为安装的一部分)。问题是,在开始使用tomcat后,该服务不可用:service{"tomcat6":ensure=>running,enable=>true,hasstatus=>true,hasrestart=>true;}所以我需要另一个list的一些要求条件,以确保服务真正运行(例如检查某些URL是否可用)。如果它还没有准备好,请等待一段时间,然后再试一次,并限制重试次数。是否有一些惯用的Puppet解决方案或其他解决方案可以实现这一目标?注意

  6. ruby - 如何等待系统命令结束 - 2

    我正在使用Ruby中的系统命令转换XLS2CSV文件。转换后我正在处理CSV文件,但是当程序要处理文件时转换仍在运行,所以那时它们不存在。谁能告诉我是否可以让Ruby等待系统命令完成的正确时间?现在我正在使用:sleep20但是如果一次要花更长的时间,那当然是不对的。我具体做的是这样的:#Callontheprogramtoconvertxlscommand="C:/Development/Tools/xls2csv/xls2csv.exeC:/TDLINK/file1.xls"system(command)do_stuffdefdo_stuff#Thisiswhereiusefile

  7. ruby - selenium-webdriver 并等待页面加载 - 2

    我正在尝试编写简单的测试。我的问题是,我想等到页面完全加载。目前我正在等待一些元素出现,但这并不是我真正想要的。是否有可能做这样的事情:driver=Selenium::WebDriver.for:chromedriver.navigate.tourldriver.wait_for_page_to_load"30000"用Java没问题,但如何用ruby​​实现呢? 最佳答案 这就是Seleniumdocs的方式()建议:require'rubygems'require'selenium-webdriver'driver=Selen

  8. ruby - 在 ruby​​ 中执行外部程序并等待其执行 - 2

    如何从ruby​​启动外部程序(如excel表)并等待其执行resp。在继续之前终止。我知道我可以用system'startexcel"my/path/to/the/sheet"'但使用它只会启动工作表然后继续。 最佳答案 您遇到的问题不是Ruby,而是启动命令,它会启动另一个程序并立即返回。您需要使用wait标志让该命令等待excel完成:system('start/waitexcel"my/path/to/the/sheet"') 关于ruby-在ruby​​中执行外部程序并等待其执

  9. ruby - 你如何使用 Ruby 找到空闲的 TCP 服务器端口? - 2

    我正在尝试创建一个使用一次的HTTP服务器来处理单个回调,并且需要帮助在Ruby中找到一个空闲的TCP端口。这是我正在做的事情的框架:require'socket't=STDIN.readport=8081whiles=TCPServer.new('127.0.0.1',port).acceptputss.getss.print"HTTP/1.1200/OK\rContent-type:text/plain\r\n\r\n"+ts.closeexitend(它回显标准输入到第一个连接然后死掉。)如何自动找到空闲端口进行监听?这似乎是在远程服务器上启Action业然后使用唯一作业ID回调

  10. ruby - 将隐式等待和显式等待结合在一起会导致意外的等待时间 - 2

    我的两个场景-1)首先@driver.manage.timeouts.implicit_wait=30@wait=Selenium::WebDriver::Wait.new(:timeout=>45)#Timegreaterthanimplicit@wait.until{@driver.find_element(:tag_name=>"body").text.include?("hey")}这给了驱动程序45秒的时间来搜索文本(这是预期的)2)第二@driver.manage.timeouts.implicit_wait=30@wait=Selenium::WebDriver::Wai

随机推荐