- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个使用 MINA 版本 2 的服务器设置。我对套接字和 tcp 没有太多经验。
问题是如果我连接到我的服务器,然后拔下我的互联网并关闭连接,(服务器没有收到连接关闭的通知)服务器将永远认为我的连接仍然有效并且有效。
服务器将继续向我的连接发送消息,并且不会抛出任何异常,即使我的计算机上没有任何内容绑定(bind)到本地端口也是如此。
如何测试连接是否仍然存在?
我试过在 Debug模式下运行 MINA 日志,并记录
IoSession.isConnected() IoSession.isActive IoSession.isClosing
他们总是返回真、真、假。此外,在 Debug模式下,没有有用的信息表明连接已丢失。它只是记录了常规的“已发送消息”内容,就好像没有任何问题一样。
在使用 Flash actionscript 时,我有过 flash 在无效套接字上运行时会抛出错误的经历。这让我相信这是在说服务器上的套接字不再对连接有效。所以换句话说,如果闪存可以检测到无效的套接字,那么 Java 服务器也应该能够正确地检测到它?
如果真的没有办法检测死连接,我总是可以设置一个连接保持 Activity 例程,客户端不断向服务器发送“我在这里”消息,并且服务器关闭没有连接的 session 传入消息几秒钟。
Java socket API: How to tell if a connection has been closed?
不幸的是
IOException 'Connection reset by peer' Doesn't occur when I write tothe IoSession in MINA.
在 Java 中是否有任何方法可以检测在发送数据包后何时未收到对 TCP 数据包的 ACK? ACK 超时?
但显然,我的计算机应该向服务器发送 RST?根据这个答案。 https://stackoverflow.com/a/1434592/4425643但这似乎是一种糟糕的端口扫描方式。这是端口扫描的工作原理吗?端口扫描器将数据发送到端口,受害者的服务以 RST 响应?抱歉,我想我需要一个新问题来解决所有这些问题。但奇怪的是,MINA 在发送数据时并没有抛出 connection reset by peer。那么我的计算机不会发送 RST。
最佳答案
Internet 协议(protocol)中的套接字 或连接 的概念是一种错觉。这是操作系统和 TCP 堆栈为您提供的一种方便的抽象,但实际上,这都是假的。
在幕后,Internet 上的所有内容都采用单个数据包的形式。
从一台计算机向另一台计算机发送数据包的角度来看,没有内置的方法可以知道该计算机是否真的在接收数据包,除非该计算机(或介于两者之间的其他计算机,如路由器)告诉您数据包是否已收到。
从一台期望从另一台计算机接收数据包的计算机的角度来看,没有办法提前知道是否有任何数据包即将到来,永远会到来,或者以什么顺序到来——直到它们实际到达。一旦它们到达,您收到一个包裹这一事实并不意味着您将来会收到更多。
这就是为什么我说连接或套接字是一种幻觉。操作系统确定连接是否“Activity ”的方式很简单,就是等待任意时间。在这段时间之后——称为超时——如果 TCP 连接的一侧没有收到另一侧的回音,它将假定另一端已断开连接,并且任意将连接状态设置为“关闭”、“死”或“终止”(“超时”)。
所以:
打个比方:如果您正在与某人通电话,而他们很可能会受伤或丧生,而您正在与他们通话并让他们接听电话,然后电话突然没电了... .. 那么,你要等多久?你认为对方在什么时候受伤或死亡?如果您等待几毫秒,在大多数情况下,这对“超时”来说太短了,因为其他人可能只是在倾听并思考如何回应。如果再等50年,那人可能早就死了。因此,您必须设置一个有意义的合理超时值。
关于java - Apache Mina,如何检测何时使用无效套接字向客户端发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39517015/
我有一个接受以下参数的函数: int setvalue(void (*)(void *)); 为了满足参数:void (*)(void *),我创建了这样一个函数: static void *
我有以下代码: typedef void VOID; int f(void); int g(VOID); 在 C 中编译得很好(在 Fedora 10 上使用 gcc 4.3.2)。与 C++ 编译的
这个问题已经有答案了: Is f(void) deprecated in modern C and C++? [duplicate] (6 个回答) 已关闭 7 年前。 B.A.T.M.A.N./A.
我在 ASP.NET Core 3.1 项目上有以下 Identity Server 4 配置: services .AddIdentityServer(y => { y.Events.R
我们有一个 O365 租户,一切都是开箱即用的。租户放置在德国云中,而不是全局 (office.de) 中。我们还开发了一个 Office 插件,使用 OAuth 2.0 授权访问共享点。首先,我们向
我有一个如下所示的路由 routes.MapRoute( name: "Default", url: "{controller}/{action}/{i
我正在尝试使用 OAuth2.0 访问 google 文档。我已经从 Google API 控制台获取了客户端 ID 和 key 。但是当我运行这段代码时,我收到了异常。如果我遗漏了什么,有人可以建议
此代码有效: let mut b: Vec = Vec::with_capacity(a.len()); for val in a.iter() { b.push(val); } 此代码不起作
使用 client_credintials 授权类型请求 EWS oauth2 v2.0 的访问 token 时出现错误。 https://login.microsoftonline.com/tena
我通过 Java 应用程序使用 Google 电子表格时遇到了问题。我创建了应用程序,该应用程序运行了 1 年多,没有任何问题,我什至在 Create Spreadsheet using Google
如何创建 匹配所有无效 Base64 字符的正则表达式?我在堆栈上找到了 [^a-zA-Z0-9+/=\n\r].*$ 但是当我尝试时我得到了带有 - 符号的结果字符串.我根本不知道正则表达式,任何人
我从 Gitlab CI/CD Pipelines 获得错误信息:yaml invalid。问题是由 .gitlab-ci.yml 脚本的第五行引起的: - 'ssh deployer@gita
我有 3 个数据源,设置如下: @Configuration @Component public class DataSourceConfig { @Bean("foo") @Conf
你好,我想用bulkCreate ex 插入数据: [ { "typeId": 5, "devEui": "0094E796CBFCFEF9", "application_name": "Pressu
UIApplicationExitsOnSuspend 不会强制我的应用程序退出。我已经清理过目标、删除了应用程序、重建并重新安装了很多次。 我确实需要退出我的应用程序。 最佳答案 您是否链接了 SD
在 iPhone 配置门户上,显示我的 iPhone 团队配置配置文件无效。有一个“由 Xcode 管理”文本。 “续订”按钮被禁用。 我该如何解决这个问题?谢谢 最佳答案 使用 Xcode 3.2.
好的,所以今天我用我们的“实时”数据库中的新信息更新了我的数据库……从那时起,我的一个表格就出现了问题。如果您需要任何代码,请告诉我,我将对其进行编辑并发布所需的代码... 我有一个报告表格,其中有一
我有一个结构体,其中有一个元素表示为 void (*func)(); 我知道 void 指针通常用于函数指针,但我似乎无法定义该函数。我不断收到取消引用指向不完整类型的指针。我用谷歌搜索了一下但没有结
我正在尝试使用 Coldfusion 9 从 ning 网络获取凭证,所以首先这是测试 api 的 curl 语法: curl -k https://external.ningapis.com/xn/
这个问题已经有答案了: Does C have references? (2 个回答) 已关闭 4 年前。 我正在学习 C 语言引用,这是我的代码: #include int main(void)
我是一名优秀的程序员,十分优秀!