- 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/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!