package tech.powerjob.common.utils.net;
|
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
|
import java.io.*;
|
import java.net.Socket;
|
import java.net.UnknownHostException;
|
import java.nio.charset.StandardCharsets;
|
|
/**
|
* socket 连通性助手
|
*
|
* @author tjq
|
* @since 2024/2/8
|
*/
|
@Slf4j
|
public class PingPongUtils {
|
|
static final String PING = "ping";
|
static final String PONG = "pong";
|
|
/**
|
* 验证目标 IP 和 端口的连通性
|
* @param targetIp 目标 IP
|
* @param targetPort 目标端口
|
* @return true or false
|
*/
|
public static boolean checkConnectivity(String targetIp, int targetPort) {
|
|
try (Socket s = new Socket(targetIp, targetPort);InputStream is = s.getInputStream();OutputStream os = s.getOutputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
|
|
s.setSoTimeout(2000);
|
s.setKeepAlive(false);
|
|
// 发送 PING 请求
|
os.write(PING.getBytes(StandardCharsets.UTF_8));
|
os.flush();
|
|
//读取服务器返回的消息
|
String content = br.readLine();
|
|
if (PONG.equalsIgnoreCase(content)) {
|
return true;
|
}
|
} catch (UnknownHostException e) {
|
log.warn("[SocketConnectivityUtils] unknown host: {}:{}", targetIp, targetPort);
|
} catch (IOException e) {
|
log.warn("[SocketConnectivityUtils] IOException: {}:{}, msg: {}", targetIp, targetPort, ExceptionUtils.getMessage(e));
|
} catch (Exception e) {
|
log.error("[SocketConnectivityUtils] unknown exception for check ip: {}:{}", targetIp, targetPort, e);
|
}
|
|
return false;
|
}
|
}
|