Java socket中isClose()和isConnected()

可以引起网络连接关闭的情况有以下4种:

1.  直接调用Socket类的close方法。

2.  只要Socket类的InputStreamOutputStream有一个关闭,网络连接自动关闭(必须通过调用InputStreamOutputStream close方法关闭流,才能使网络可爱接自动关闭)。

3.  在程序退出时网络连接自动关闭。

4.  将Socket对象设为null或未关闭最使用new Socket(…)建立新对象后,由JVM的垃圾回收器回收为Socket对象分配的内存空间后自动关闭网络连接。   

虽然这4种方法都可以达到同样的目的,但一个健壮的网络程序最好使用第1种或第2种方法关闭网络连接。这是因为第3种和第4种方法一般并不会马上关闭网络连接,如果是这样的话,对于某些应用程序,将会遗留大量无用的网络连接,这些网络连接会占用大量的系统资源。

Socket对象被关闭后,我们可以通过isClosed方法来判断某个Socket对象是否处于关闭状态。然而使用isClosed方法所返回的只是Socket对象的当前状态,也就是说,不管Socket对象是否曾经连接成功过,只要处于关闭状态,isClosde就返回true。如果只是建立一个未连接的Socket对象,isClose也同样返回true。如下面的代码将输出false

 

Socket socket = new Socket();
System.out.println(socket.isClosed());

  

除了isClose方法,Socket类还有一个isConnected方法来判断Socket对象是否连接成功。看到这个名字,也许读者会产生误解。其实isConnected方法所判断的并不是Socket对象的当前连接状态,而是Socket对象是否曾经连接成功过,如果成功连接过,即使现在isClose返回trueisConnected仍然返回true。因此,要判断当前的Socket对象是否处于连接状态,必须同时使用isCloseisConnected方法,即只有当isClose返回falseisConnected返回true的时候Socket对象才处于连接状态。下面的代码演示了上述Socket对象的各种状态的产生过程。

 

 

package mysocket;

import java.net.*;

public class MyCloseConnection
{
    
public static void printState(Socket socket, String name)
    {
        System.out.println(name 
+ ".isClosed():" + socket.isClosed());
        System.out.println(name 
+ ".isConnected():" + socket.isConnected());
        
if (socket.isClosed() == false && socket.isConnected() == true)
            System.out.println(name 
+ "处于连接状态!");
        
else
            System.out.println(name 
+ "处于非连接状态!");
        System.out.println();
    }

    
public static void main(String[] args) throws Exception
    {
        Socket socket1 
= null, socket2 = null;

        socket1 
= new Socket("www.ptpress.com.cn"80);
        printState(socket1, 
"socket1");

        socket1.getOutputStream().close();
        printState(socket1, 
"socket1");

        socket2 
= new Socket();
        printState(socket2, 
"socket2");

        socket2.close();
        printState(socket2, 
"socket2");
    }
}

 

运行上面的代码后,将有如下的输出结果:

 

       socket1.isClosed():false

socket1.isConnected():true

socket1处于连接状态!

 

socket1.isClosed():true

socket1.isConnected():true

socket1处于非连接状态!

 

socket2.isClosed():false

socket2.isConnected():false

socket2处于非连接状态!

 

socket2.isClosed():true

socket2.isConnected():false

socket2处于非连接状态!

 

从输出结果可以看出,在socket1OutputStream关闭后,socket1也自动关闭了。而在上面的代码我们可以看出,对于一个并未连接到服务端的Socket对象socket2,它的isClosed方法为false,而要想让socket2isClosed方法返回true,必须使用socket2.close显示地调用close方法。

### 回答1: Java socket断线重连是指当网络连接异常断开后,重建网络连接,保证数据的准确传递。实现 java socket断线重连需要考虑以下几个方面: 第一个方面是异常断线的检测。Java socket建立的连接一旦因为网络不稳定等原因断掉,就会抛出SocketException异常。可以通过捕获该异常来检测连接的异常断开情况。 第二个方面是断线重连的实现。可以先关闭当前Socket对象,并重新建立一个Socket对象连接到相同的目标IP和端口上,使用while循环在代码封装,达到断线自动重连的效果。 第三个方面是防止频繁重连。如果网络环境不稳定,频繁的重连对于目标服务器负担过大,需要采取一些措施来避免频繁重连造成的问题,例如设置重连间隔时间,减小重连次数等。 以上是实现java socket断线重连的主要思路和注意事项。在实际项目,还需要根据具体情况进行具体的实现,例如:根据服务器状态信息自适应地调整重连策略等等。需要注意的是,网络连接是一个非常复杂的问题,断线重连只是一种解决方案,需要综合考虑各种因素,才能保证连接的稳定性和数据的完整传输。 ### 回答2: Java Socket断线重连是指在网络通讯过程,由于网络不稳定或者其他原因,Socket连接断开后,能够自动重连并恢复通讯的一种技术。 在Java,可以通过编写客户端和服务端代码,建立Socket连接,并对连接进行监控。当连接断开后,客户端或者服务端会收到一个异常提示,并可以在异常处理加入重连代码,使得Socket能够重新建立连接并继续通讯。 要实现Socket断线重连功能,需要按以下步骤进行: 1. 在异常处理获取Socket连接对象并关闭该连接。 2. 在循环进行重连操作,直到连接成功或者超过最大重连次数。 3. 等待若干秒后再次尝试连接。 以下是JavaSocket断线重连的示例代码: ```java public void connect() { boolean isConnected = false; int attempts = 0; while (!isConnected && attempts < 3) { try { socket = new Socket("localhost", 8080); isConnected = true; } catch (IOException e) { attempts++; System.out.println("Connection attempt " + attempts + " failed"); try { Thread.sleep(5000); } catch (InterruptedException ie) { System.out.println("InterruptedException occurred: " + ie.getMessage()); } } } if (isConnected) { System.out.println("Successfully connected to server"); } else { System.out.println("Failed to connect to server"); } } ``` 以上代码会尝试连接“localhost”服务器8080端口,并在连接失败后进行重连操作,重连3次后若仍然无法成功连接则退出。在每次重连前,程序会等待5秒钟。通过此方法,可以让Socket断线重连更加稳定可靠地工作。 ### 回答3: JavaSocket是一种通信机制,用于在网络上发送和接收数据。在网络通信,由于网络环境不稳定,经常会出现连接断开的情况。一旦连接断开,我们就需要进行重新连接,让程序继续工作。下面是Java Socket断线重连的详细介绍。 Java Socket断线重连需要实现以下几个步骤: 1.创建并打开Socket连接 在Java,可以使用InetSocketAddress和Socket对象来创建和打开Socket连接。 2.设置Socket的属性 在Java Socket编程,可以使用Socket类提供的方法来设置Socket的属性。其,setSoTimeout()方法可以设置Socket的超时时间,如果连接在规定的时间内没有成功建立,就会发生连接错误并抛出异常。 3.检查Socket状态 在Java Socket编程,可以使用Socket类提供的isClosed()和isConnected()方法分别检查Socket连接是否已关闭和是否已连接。 4.实现Socket断线重连 如果Socket连接被断,需要使用try-catch语句块来捕获异常,并在捕获异常后尝试重新连接。可以使用while循环来实现Socket重连操作。 5.关闭Socket连接 在Java Socket编程,可以使用Socket类提供的close()方法来关闭Socket连接。 需要注意的是,在Java Socket断线重连的过程,需要充分考虑网络环境不稳定的情况,避免频繁重连造成程序系统负荷过大的情况。同时,需要充分测试程序的异常处理和重连功能,确保程序可以正常工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值