DatagramChannel.close() 在 Windows 上保持端口打开

2024-03-30

我正在实施一个发现流程:

  • 打开 UDP 套接字以侦听给定端口上的广播响应
  • 发送一些请求(并期待稍后的响应)
  • 在给定时间段后关闭 UDP 套接字

第一次通话有效。但其他调用会出现绑定错误。地址已被使用:绑定

我运行的是Windows 7。我做了一些测试,发现在channel.close();之后Netstat 仍然给出:

netstat -a -b -sp udp | netstat -a -b -sp udp | grep 55224

UDP 0.0.0.0:55224:

所以udp端口还是在OS层面开放的

我在网上搜索了一下,可能是操作系统级别的泄漏:一些java数据报套接字问题 https://stackoverflow.com/questions/6361741/some-java-datagram-socket-questions

我运行了 2 个测试,一个使用 NIO 通道,另一个不使用(来自在网上找到的测试)。我用 NIO 版本重现了我的错误,但如果我不使用 NIO,它就会工作。

任何人都可以告诉我如何让它与 NIO 一起工作。目标平台是Android,我不知道t wan始终收听广播,但仅限于重复的一段时间。

测试插座

    public void testConnectCloseWithSocket() {
    long tCumulative = 0;
    int errAt = -1;
    System.out.println("start...");
    for (int i = 0; i < 4000; i++) {
        try {
            errAt = i;
            DatagramSocket result = new DatagramSocket(null);
            result.bind(new InetSocketAddress(InetAddress.getLocalHost(), 9005));
            result.close();

            //success at last
            tCumulative = 0;

        } catch (Exception e) {
            System.out.println("Error (at="+errAt+") (waited="+tCumulative+"ms): " + e.getMessage());

            tCumulative+=50;
            try {
                Thread.sleep(50);
            } catch (InterruptedException e1) {


            }
            i--;
        }
    }
    System.out.println("end...");

}

结果套接字

开始... 错误(at=1319)(等待=0ms):地址已在使用中:无法绑定

错误(at=1438)(等待=0ms):地址已在使用中:无法绑定

错误(at=1587)(等待=0ms):地址已在使用中:无法绑定

错误(at=1740)(等待=0ms):地址已在使用中:无法绑定

end...


我确实遇到了一些错误,但套接字正确关闭...这适合我的需要

使用通道进行测试

    public void testConnectCloseWithChannel() {
    long tCumulative = 0;
    int errAt = -1;
    System.out.println("start...");
    for (int i = 0; i < 4000; i++) {
        try {
            errAt = i;
            Selector selector = Selector.open();
            DatagramChannel channel = DatagramChannel.open();
            channel.configureBlocking(true);
            channel.socket().bind(new InetSocketAddress(InetAddress.getLocalHost(), 9005));
            SelectionKey clientKey = channel.register(selector, SelectionKey.OP_READ);
            clientKey.cancel();
            channel.close();

            //success at last
            tCumulative = 0;

        } catch (Exception e) {
            System.out.println("Error (at="+errAt+") (waited="+tCumulative+"ms): " + e.getMessage());

            tCumulative+=50;
            try {
                Thread.sleep(tCumulative);
            } catch (InterruptedException e1) {


            }
            i--;
        }
    }
    System.out.println("end...");

}

注意:如果对channel.register进行注释,则测试有效..


渠道结果

开始... 错误(at=0)(等待=0ms):null 错误(at=0)(等待=50ms):地址已在使用中:绑定

错误(at=0)(等待=100ms):地址已在使用中:绑定

错误(at=0)(等待=150ms):地址已在使用中:绑定 ...


谢谢你的帮助


我确实遇到了一些错误,但套接字正确关闭......这是 满足我的需求

不,如果您出现错误,则说明您的频道未正确关闭。

你必须做close in the finally你的条款try block.

Selector selector = Selector.open();
try
{
  DatagramChannel channel = DatagramChannel.open();

  try
  {
    channel.configureBlocking(true);
    channel.socket().bind(
      new InetSocketAddress(InetAddress.getLocalHost(), 9005)
    );
    SelectionKey clientKey = channel.register(selector, SelectionKey.OP_READ);
    clientKey.cancel();
  }
  finally
  {
    channel.close();
  }
}
finally
{
  selector.close( )
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DatagramChannel.close() 在 Windows 上保持端口打开 的相关文章

随机推荐

  • 创建像 Office 2010 一样的动画启动屏幕

    如何使用 C 创建像 Office 2010 中那样的动画启动屏幕 这个问题是关于winform还是wpf 如果是关于wpf的 动画启动屏幕只不过是加载 主窗口 时显示的 wpf 窗口 您可以按照 wischi 的说明使用 Expressi
  • jquery 移动和 flot 库

    我正在一个小型 jquery 移动框架站点中实现 flot 包含flot的页面 内容div位于辅助页面上 第一次显示浮动页面时 图表呈现得很好 返回到主页并再次前进到浮动页面时 图表不会呈现 内容来自 asp mvc 视图 div div
  • AS3 到 JS 编译器

    我偶然发现了 AS3 到 JS 编译器Jangaroo http www jangaroo net home 看起来它可能是一个有用的工具 因为它支持很多我喜欢的 AS3 功能 还有其他这样的编译器吗 我可以使用其他语言吗 学习一下 编译成
  • 您可以在 display:table-cell 中相对或绝对定位项目吗?

    我有一个链接 我希望它始终位于其所在单元格的右下角 现在该链接位于 元素中 我尝试同时进行绝对定位和相对定位 但可以获得我想要的效果 我有一排有 4 个单元格 当尝试应用绝对位置时 它将元素带到右侧的最后一个单元格 而不是仅仅将其放置在它所
  • matlab中无for循环的行列矩阵乘法

    我遇到以下问题 并且无法想出没有 for 循环的解决方法 考虑两个矩阵 a rand N 3 b rand 3 N 我想要得到的是 b i a i 一个 3 3 矩阵 在第三维中串联所有i 因此 对于上面的示例 结果应该是 3 3 N 矩阵
  • 如何在 Eloquent 中检查行是否被软删除?

    在 Laravel 5 1 中 有没有一种好方法来检查雄辩的模型对象是否已被软删除 我不是在谈论选择数据 而是一旦我有了对象 例如Thing withTrashed gt find id 到目前为止我能看到的唯一方法是 if thing g
  • 证书验证失败:无法获取本地颁发者证书

    我正在尝试使用 python 从网络获取数据 我为其导入了 urllib request 包 但在执行时出现错误 certificate verify failed unable to get local issuer certificat
  • 在共享 x 轴的子图上绘制时 x 刻度消失[重复]

    这个问题在这里已经有答案了 当我尝试在同一个子图上绘制一条线和一个区域时 会发生这种情况 我发现我的 x 刻度在我调用 ay ax twinx 并在 ay 上绘图后消失了 这是导致此错误的我的代码 fig axes plt subplots
  • 将react-hooks-testing-library与jest.spyOn一起使用 - 不调用间谍

    我在设置单元测试以确定是否使用正确的参数调用函数时遇到问题 useAHook返回函数foo它调用函数bar 代码看起来像这样 myModule js export const useAHook arg1 arg2 gt const foo
  • Android:RES 目录中除 ic_ 之外的文件前缀标准?

    有人知道 RES 目录中是否有我们需要使用 或建议使用 的标准前缀列表 即 Android 建议使用 ic 作为图标 这很棒 我正在遵循这一点 但是徽标 按钮图像 导航图像等呢 我真的很想知道是否存在其他人以及其他人都在使用什么 提前致谢
  • WPF Multitrigger.ExitActions 将覆盖正常触发器

    我有一个无法解决的问题 所以我请她寻求帮助 这是导致我出现问题的代码的一部分
  • 每个基于 WebKit 的浏览器都会使使用 Omniture 的网站崩溃。为什么?

    其实 更准确的说法是 Every基于 WebKit 的浏览器崩溃http m allrecipes com http m allrecipes com 但仅在一个三星 Continuum SCH i400 http www samsung
  • HTML5 画布以一定角度绘制图像

    我正在尝试动画
  • 类似于浏览器的 async_hooks 之类的东西?

    我正在尝试调试在浏览器上下文中运行的一些 第三方 代码 并且我想跟踪所有下游异步函数调用 几乎完全相同async hooks为nodejs提供 本质上 类似https github com mafintosh why is node run
  • putText 用于 UTF-8 字符 (C++)

    我正在使用 putText OpenCV 方法在图像上写入文本 但它仅适用于 ASCII 字符 我需要打印诸如 之类的字符 有人可以帮忙吗 很遗憾 cv putText 仅支持 ASCII 有一个打开错误报告 http www code o
  • 跨多个场景使用 AVAudioPlayer Swift 并能够调节音量

    您好 我想知道是否有一种方法可以在多个场景中使用 AVAudioPlayer 并更改音量 我目前将其放置在我的 gameViewController 中 它是我的应用程序所有场景的控制器 override func viewDidAppea
  • Rails 关联方法如何工作?

    Rails 关联方法如何工作 让我们考虑这个例子 class User lt ActiveRecord Base has many articles end class Article lt ActiveRecord Base belong
  • 将 SVG 作为 Gatsby 中的组件导入

    我见过以下解决方案 import ReactComponent as Img from path to file svg 但在盖茨比看来 这行不通 我知道存在这方面的插件 但也许可以更容易地完成 正如您所说 有一些插件可以实现此目的 这意味
  • 为什么 C++ 标准没有提到 __STDC_IEC_559__?

    根据 C 11 标准 c math
  • DatagramChannel.close() 在 Windows 上保持端口打开

    我正在实施一个发现流程 打开 UDP 套接字以侦听给定端口上的广播响应 发送一些请求 并期待稍后的响应 在给定时间段后关闭 UDP 套接字 第一次通话有效 但其他调用会出现绑定错误 地址已被使用 绑定 我运行的是Windows 7 我做了一