Java 连接被拒绝后套接字关闭-这是正常行为吗?

Java 连接被拒绝后套接字关闭-这是正常行为吗?,java,android,sockets,connection,Java,Android,Sockets,Connection,我正在玩android socket接口,我从文档中了解到 .isConnected()和isClosed()方法没有说明套接字状态,但是 但是,如果我们在插座上调用了connect和close,这些指示就会消失 在我的应用程序中,我在两次尝试之间延迟10秒实施重试, 我看到了一件奇怪的事情,如果我从服务器获得连接被拒绝,我的下一次尝试是 失败,因为套接字已关闭 真的是这样吗 以下是我的连接功能: private boolean ConnectToServer() { int

我正在玩android socket接口,我从文档中了解到 .isConnected()和isClosed()方法没有说明套接字状态,但是 但是,如果我们在插座上调用了connect和close,这些指示就会消失

在我的应用程序中,我在两次尝试之间延迟10秒实施重试, 我看到了一件奇怪的事情,如果我从服务器获得连接被拒绝,我的下一次尝试是 失败,因为套接字已关闭

真的是这样吗

以下是我的连接功能:

  private boolean ConnectToServer() {
        int retry = 0;
        try {
            ServerIP = InetAddress.getByName(mServer);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        SocketAddress mSocketAddress = new InetSocketAddress(ServerIP, mPort);

        while ((!mSocket.isConnected()) && retry < 10) {
            mLogger.setMessage("Status isConnected:"+mSocket.isConnected()+"Status isClosed:"+mSocket.isClosed());
            mLogger.sendLog();
            try {
                mSocket.connect(mSocketAddress, 3000);
            } catch (IOException e) {
                e.printStackTrace();
            }
            retry++;
            mLogger.setMessage("Attempting to connect to server - Sleeping for 5 Seconds Rety="+retry);
            mLogger.sendLog();
            SystemClock.sleep(5000);
        }
        mLogger.setMessage("Returning from attempting connection with socket status "+mSocket.isConnected());
        return mSocket.isConnected();

    }
正如您从日志中看到的,当我调用之前的connect to isClosed方法时,它返回false,但就在我尝试连接之后,我得到的异常是socket closed

我唯一一次没有关闭套接字是在第一次尝试时,这让我明白操作系统正在关闭套接字。。。然而,在这种情况下,我如何尝试重试,以及如何知道操作系统是否因为其他原因关闭了套接字

我看到一件奇怪的事。如果服务器拒绝连接,我的下一次尝试将失败,因为套接字已关闭

真的是这样吗

对。连接失败将关闭
套接字
,您将无法再次使用它

这让我明白操作系统正在关闭套接字

实际上,在某些情况下,关闭是由Java发起的。(这并不重要。)

在这种情况下,我如何尝试重试

您需要放弃
Socket
对象,创建另一个对象并与之连接。基本重试逻辑如下所示:

SocketAddress address = new InetSocketAddress(...);
while (retry <= NOS_RETRIES) {
    Socket = new Socket();
    try {
        socket.connect(address, port);
        return socket;
    } catch (IOException e) {
        // possibly log exception
        if (/* it makes no sense to retry */) {
           // rethrow e, or return null
        }
    retry++;
    // delay
}
// rethrow last e, or return null
SocketAddress address=新的InetSocketAddress(…);

虽然(重试是的,这是正常的行为。不,你不能重用套接字。为什么你在成功后还要打印重试消息?打印“重试我的错误”,但不会真正影响流程…Kayaman-有没有关于如何实现重试的建议?我应该关闭线程并从活动中启动新线程并在那里处理它?还是应该生成新线程从当前线程执行线程并关闭原始线程?我唯一不明白的是.isclosed方法返回false的原因…但我想这就是它的原因…解释为什么会发生这种情况有点困难(很复杂)。但无论如何,您不应该在重试代码中使用
isclosed
SocketAddress address = new InetSocketAddress(...);
while (retry <= NOS_RETRIES) {
    Socket = new Socket();
    try {
        socket.connect(address, port);
        return socket;
    } catch (IOException e) {
        // possibly log exception
        if (/* it makes no sense to retry */) {
           // rethrow e, or return null
        }
    retry++;
    // delay
}
// rethrow last e, or return null