当前位置: 首页 > 面试题库 >

插座如何连接和闭合?

勾渝
2023-03-14
问题内容

我正在使用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


问题答案:

该主题对此主题进行了一些有用的讨论。事实证明,Socket.isConnected如果(曾经)成功连接,则返回true。

从上面的线程:

使用Socket()似乎已被忽略的时,它会
Socket.isConnected()告诉您是否Socket.connect()已被调用。isClosed()和和类似close()

这些方法的混淆是由于将受应用程序控制的 套接字 状态与受协议控制的整个 连接 状态混淆 。
isConnected()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

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



 类似资料:
  • 我目前正在编写一个简单的TCP聊天客户端服务器应用程序,它与套接字一起工作。客户端连接到服务器,一旦被接受,就会创建一个新的工作线程来侦听客户端输入。连接到服务器(端口8818处的localhost)工作正常,但只要工作线程在登录java.net之后开始监听更多客户端输入。SocketException:引发连接重置(请参阅下面的堆栈跟踪)。我知道,此异常的一个可能来源可能是服务器或客户端未正确或

  • 问题内容: Java 类有两种方法,分别检查套接字是关闭还是连接。我想知道仅开放的TCP套接字与开放和连接的TCP套接字有什么区别,这与UDP有何不同。 问题答案: 为了把事情简单地说,这是 开放的 是要么等待连接或已与另一个成功连接的插座。当一个套接字被 关闭 ,这意味着这个套接字没有连接不再可用,而且它的资源已被释放。一个已连接的好,这意味着该套接字已连接到另一个。 这样可以 同时打开并连接。

  • 背景我正试图为我的java服务器创建一个android客户端应用程序,并让它们使用TCP套接字进行通信。 当我在android设备模拟器上运行我的应用程序时,它的工作原理是什么 当我在手机上运行该应用程序时,我无法正常工作,我在创建套接字时遇到连接超时。 异常 java.net.Connect异常: 无法连接到 /10.0.2.2 (端口 9111): 连接失败: ETIMEDOUT (连接超时)

  • 问题内容: 该程序连接到服务器,并且当服务器关闭连接时,如果我尝试重新连接,它会说: 如果我关闭客户端中的套接字,然后尝试重新连接,它会说:。 有没有办法在管道破裂后重新连接它而不创建新的套接字? 问题答案: 假设这是一个面向连接的套接字: 否。您必须关闭旧的插座并创建一个新的插座,

  • 我在我的电脑上开发了一个带有python的HIDServer(蓝牙键盘)。有2个服务器套接字(psm 0x11和0x13)正在侦听连接。当我尝试将IPhone连接到计算机时,我收到了一个传入连接(如hcidump中所示),但不知何故,连接被远程主机终止。我的套接字永远无法接受客户端连接。你能帮帮我吗? hciDumps: 启动我的程序后: HCI事件:命令完成(0x0e)plen 4写入扩展查询响

  • 我正在开发一个单例BluetoothHelper类。在connectToBTDevice()方法中,调用了一个新线程,在该线程中,蓝牙套接字试图连接到蓝牙设备。不幸的是,它开始时很好,但退出时有一个警告系统。错误如下: BluetoothHelper.java onnectToBTDevice(BluetoothDevice device)方法位于第234行。BluetoothSocket con