套接字如何既可以连接又可以关闭?

2024-04-08

我正在使用 Java 套接字客户端。如果服务器仍然连接到我的客户端,但它没有发送对我的消息的响应 - 我最终会收到读取超时异常。

在这种情况下,我想测试一下是否应该重新连接我的套接字,或者只是保留它并重新使用它。

我使用这个条件:

if (!socket.isConnected() || socket.isClosed() || !socket.isBound()) {
    try {
        socket.close();
    } catch (IOException e1) {
    }
    // Wait on a new connection
    socket = connectSocket(.....);
}

但我似乎总能重新建立联系。当我记录布尔属性的值时,我看到以下内容:

连接:true 关闭:true 绑定:true

怎么才能连接和关闭呢?

TIA


这个线程 http://www.javakb.com/Uwe/Forum.aspx/java-programmer/7473/Socket-isConnected-isClosed关于这个主题有一些有用的讨论。事实证明Socket.isConnected http://download.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#isConnected%28%29如果(曾经)成功连接,则返回 true。

从上面的线程:

当你使用Socket(),你似乎忽略了,Socket.isConnected()告诉你是否Socket.connect()已被称为 或不。同样对于isClosed() and close().

对这些方法的混淆是由于混淆了socket,这是在应用程序的控制下,状态 总体的联系,这是在协议的控制下。isConnected() and isClosed()告诉你对套接字做了什么。 除了读和写之外,没有其他 API 可以确定状态 连接。

文档说:

如果套接字成功连接到服务器,则返回 true

并不像人们想象的那样“如果套接字连接到服务器则返回 true".

可以通过查看 Socket 的来源来确认该行为:

public boolean isConnected() {
    // Before 1.3 Sockets were always connected during creation
    return connected || oldImpl;
}

您还可以运行这个小测试片段:

Socket s = new Socket();

System.out.println("isConnected: " + s.isConnected() +
                  " isBound: "     + s.isBound() +
                  " isClosed: "    + s.isClosed());

s.connect(new InetSocketAddress("google.com", 80));

System.out.println("isConnected: " + s.isConnected() +
                   " isBound: "    + s.isBound() +
                   " isClosed: "   + s.isClosed());

s.close();

System.out.println("isConnected: " + s.isConnected() +
                   " isBound: "    + s.isBound() +
                   " isClosed: "   + s.isClosed());

哪个打印:

isConnected: false isBound: false isClosed: false
isConnected: true isBound: true isClosed: false
isConnected: true isBound: true isClosed: true

我必须说文档在这一点上相当不清楚,并且方法名称有点误导。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

套接字如何既可以连接又可以关闭? 的相关文章

  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 添加动态数量的监听器(Spring JMS)

    我需要添加多个侦听器 如中所述application properties文件 就像下面这样 InTopics Sample QUT4 Sample T05 Sample T01 Sample JT7 注意 这个数字可以多一些 也可以少一些
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • 在文本文件中搜索单词并返回其频率

    如何在包含单词文本的文本文件中搜索特定单词并返回其频率或出现次数 使用扫描仪 String text Question how to search for a particular word in a text file containin
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 无法加载或查找主类,可以在命令行中使用,但不能在 IDE 中使用[重复]

    这个问题在这里已经有答案了 在将其标记为重复之前 请先听我说完 我正在尝试使用 gradle 导入一个 java 项目 功能齐全 适用于所有其他笔记本电脑 没有问题 我的项目 100 正常运行 适用于所有其他笔记本电脑 当我的笔记本电脑被重
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • Java 收集返回顶级项目的映射的嵌套流

    我有以下模型 class Item String name List
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 如何在 Perl 中使用原始套接字?

    你怎样才能得到一个rawPerl 中的套接字 那么构建与其一起使用的数据包的最佳方法是什么 与在 C 中执行的操作相同 通过在创建套接字时设置套接字类型 在示例中CPAN http search cpan org rgarcia perl
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • Python仅枚举反向索引

    我正在尝试反转给出的索引enumerate同时保留被枚举列表的原始顺序 假设我有以下内容 gt gt range 5 0 1 2 3 4 如果我列举这一点 我会得到以下结果 gt gt list enumerate range 5 0 0
  • 如何可靠地检查工作站上当前用户的 Windows 域 ID

    我正在使用 C 和 Net Framework 4 我正在寻找一种万无一失的方法来获取当前登录的 Windows 用户的登录 ID 该方法不易被假冒或黑客攻击 我正在以以下形式查找此内容 域名 用户名 例如某个域 JohnDoe 目前我拥有
  • 限制 Django 的 inlineformset_factory 只创建新对象

    我正在使用 django 的内联表单集工厂 要使用文档中的示例 author Author objects get pk 1 BookFormSet inlineformset factory Author Book formset Boo
  • 如何使用一个 R 包中被另一包屏蔽的函数? [复制]

    这个问题在这里已经有答案了 我想用recode来自car包裹 但如果我有Hmisc加载后 它掩盖了car版本 可能有一种方法可以调用屏蔽函数 也许还有一种方法可以强制一个包成为主导包 你可能会遇到更深层次的问题 但在顶层car recode
  • 在 Angular / Typescript 中对包含整数和字母字母的数组进行排序

    我打算做什么 我尝试像这样对数组进行排序 1 2 2 a 2 b 2 b AsimpleName 2 b NameWithN 3 4 4 a 在 Angular2 中 我当前的代码 成分 this streetDetailRef this
  • 在 Yosemite 上编译 caffe

    我正在尝试在 Yosemite 上安装 caffe 但我的 C 不是最强的 这是我的错误 Alis MacBook Pro caffe ali make all NVCC src caffe layers absval layer cu u
  • Carbon Emacs 不粘贴 Microsoft Word 复制的内容

    不确定 Stackoverflow 是否是正确的站点 我在 mac ox 10 6 7 上使用 Carbon emacs 22 0 971 和 MS Word 12 2 8 我在 MS Word 中有一些文本 我想将其复制并粘贴到 emac
  • python将文件发送到作为服务运行的tika

    参考这个问题 https stackoverflow com questions 16251436 unable to run java command from cgi我想将 MS Word doc 文件发送到作为服务运行的 tika 应
  • 将子目录分离(移动)到单独的 Git 存储库中

    我有一个Git http en wikipedia org wiki Git 28software 29存储库 其中包含许多子目录 现在我发现其中一个子目录与另一个子目录无关 应该分离到一个单独的存储库 如何在保留子目录中文件的历史记录的同
  • 创建自定义 ODBC 驱动程序

    在我目前的工作中 我们希望实现自己的 odbc 驱动程序 以允许许多不同的应用程序能够作为数据源连接到我们自己的应用程序 现在我们正在尝试权衡根据实施规范开发我们自己的驱动程序的选项 这是巨大的 or使用允许程序员 填充 数据特定部分并允许
  • Docker 链接容器、Docker 网络、Compose 网络 - 我们现在应该如何“链接”容器

    我有一个现有的应用程序 由在同一主机上运行的 4 个 docker 容器组成 它们已通过以下方式连接在一起link命令 然而 在对docker进行了一些升级之后 link行为已被弃用 并且似乎发生了变化 我们遇到的问题是容器现在失去了彼此的
  • 如何使用带有 ARRAY 关键字的 Postgresql GIN 索引

    我想创建GIN使用标量文本列上的索引ARRAY 表达式如下 CREATE TABLE mytab scalar column TEXT CREATE INDEX idx gin ON mytab USING GIN ARRAY scalar
  • cuda中的count3非常慢

    我在 CUDA 中编写了一个小程序 用于计算 C 数组中有多少个 3 并打印它们 include
  • 解析树和语法信息

    有谁知道在哪里可以找到好的在线资源以及如何制作语法和解析树的示例 最好是介绍材料 信息是 n00b 友好的 我自己在 Google 上没有找到任何好的信息 Edit 我正在考虑理论 而不是特定的解析器软件 网上没有 不过也许你应该看看编译器
  • 如何向 XAML 窗口添加多个资源?

    我现在有一个小问题 我不知道如何解决 我想向一个窗口添加两个资源 一个是 XAML 文件样式资源 另一个是 ValueConverter 类 如果我一次只使用一种资源 它们都会起作用
  • 使用 g-signin 按钮,G+ 登录立即将我注销 3 次

    我在 HEAD 中的代码是
  • 将 python 日志记录与 AWS Lambda 结合使用

    正如 AWS 文档所示 import logging logger logging getLogger logger setLevel logging INFO def my logging handler event context lo
  • 如何导入更高一级的模块?

    For app init py abc py mod init py def py 如何从 def py 导入 abc py 导入当前模块父目录中的模块 abc py import os parentdir os path dirname
  • 鼠标移动时放大图像:到达所有角落

    我正在研究缩放功能 此缩放是一个具有 100 窗口大小的固定框 并且位于具有 200 固定框宽度的图像内部 这个缩放需要像这样工作 当光标位于窗口中央时 图像应位于中央 当光标位于右上角时 图像应停留在窗口的右上角 因此可以通过角到达图像
  • 套接字如何既可以连接又可以关闭?

    我正在使用 Java 套接字客户端 如果服务器仍然连接到我的客户端 但它没有发送对我的消息的响应 我最终会收到读取超时异常 在这种情况下 我想测试一下是否应该重新连接我的套接字 或者只是保留它并重新使用它 我使用这个条件 if socket