Java网络Socket编程-Socket监测

一个用于监测网络端口状态的线程类,其作用是通过创建一个 Socket 连接到指定的 IP 地址和端口,然后检查连接是否成功建立。

代码中的 SocketThread 类继承自 Thread,意味着它可以在单独的线程中执行。在 run 方法中,通过使用 Socket 类与指定的 IP 地址和端口建立连接,并设置一个连接超时时间。

如果连接成功建立,即 socket.connect 方法没有抛出异常,那么表示指定的端口在指定的 IP 地址上是打开的。在这种情况下,将更新监控 socket 的状态为 "OPEN",并通知相关的监控服务。

如果连接无法建立或者抛出异常,那么表示指定的端口在指定的 IP 地址上是关闭的或者无法解析的。在这种情况下,将更新监控 socket 的状态为 "CLOSE",并通知相关的监控服务。

代码中的 running 变量用于控制线程的运行状态,当调用 stopThread 方法时,将设置 runningfalse,从而终止线程的执行。

此线程以每 3 秒的间隔循环执行连接检查操作,即每隔 3 秒尝试连接一次,并根据连接结果更新状态

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

public class SocketThread extends Thread{


    private volatile boolean running = true;
    private String ip;
    private Integer port;

    private Long socketId;

    private IMonSocketService monSocketService;

    private String status = "";

    public SocketThread(Long socketId,String ip,Integer port,IMonSocketService monSocketService){
        this.socketId = socketId;
        this.ip = ip;
        this.port = port;
        this.monSocketService = monSocketService;
    }

    public void stopThread() {
        running = false;
    }

    public void run() {
        while (running){
            try (Socket socket = new Socket()) {
                SocketAddress endpoint = new InetSocketAddress(ip, port);
                int timeout = 3000;
                socket.connect(endpoint, timeout);
//                System.err.println("Port " + port + " on " + ip + " is open");
                if(!"open".equals(status)){
                    monSocketService.updateMonSocketStatus(socketId, Status.OPEN);
                    status = "open";
                }
            } catch (IOException ex) {

//                System.err.println("Port " + port + " on " + ip + " is closed");
                if(!"close".equals(status)){
                    monSocketService.updateMonSocketStatus(socketId, Status.CLOSE);
                    status = "close";
                }
            } catch (Exception ex) {
//                System.err.println("Hostname could not be resolved");
                if(!"close".equals(status)){
                    monSocketService.updateMonSocketStatus(socketId, Status.CLOSE);
                    status = "close";
                }
            }
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值