`

java实现ping功能

    博客分类:
  • JVM
阅读更多
一、纯Java实现ICMP的ping命令
import java.io.*;
import java.net.*;
import java.nio.channels.*;
import java.util.*;
import java.util.regex.*;
public class Ping {
    static int DAYTIME_PORT = 13;
    static int port = DAYTIME_PORT;
    static class Target {
        InetSocketAddress address;
        SocketChannel channel;
        Exception failure;
        long connectStart;
        long connectFinish = 0;
        boolean shown = false;
        Target(String host) {
            try {
                address = new InetSocketAddress(InetAddress.getByName(host),
                        port);
            } catch (IOException x) {
                failure = x;
            }
        }
        void show() {
            String result;
            if (connectFinish != 0)
                result = Long.toString(connectFinish - connectStart) + "ms";
            else if (failure != null)
                result = failure.toString();
            else
                result = "Timed out";
            System.out.println(address + " : " + result);
            shown = true;
        }
    }
    static class Printer extends Thread {
        LinkedList pending = new LinkedList();
        Printer() {
            setName("Printer");
            setDaemon(true);
        }
        void add(Target t) {
            synchronized (pending) {
                pending.add(t);
                pending.notify();
            }
        }
        public void run() {
            try {
                for (;;) {
                    Target t = null;
                    synchronized (pending) {
                        while (pending.size() == 0)
                            pending.wait();
                        t = (Target) pending.removeFirst();
                    }
                    t.show();
                }
            } catch (InterruptedException x) {
                return;
            }
        }
    }
    static class Connector extends Thread {
        Selector sel;
        Printer printer;
        LinkedList pending = new LinkedList();
        Connector(Printer pr) throws IOException {
            printer = pr;
            sel = Selector.open();
            setName("Connector");
        }
        void add(Target t) {
            SocketChannel sc = null;
            try {
                sc = SocketChannel.open();
                sc.configureBlocking(false);
                boolean connected = sc.connect(t.address);
                t.channel = sc;
                t.connectStart = System.currentTimeMillis();
                if (connected) {
                    t.connectFinish = t.connectStart;
                    sc.close();
                    printer.add(t);
                } else {
                    synchronized (pending) {
                        pending.add(t);
                    }
                    sel.wakeup();
                }
            } catch (IOException x) {
                if (sc != null) {
                    try {
                        sc.close();
                    } catch (IOException xx) {
                    }
                }
                t.failure = x;
                printer.add(t);
            }
        }
        void processPendingTargets() throws IOException {
            synchronized (pending) {
                while (pending.size() > 0) {
                    Target t = (Target) pending.removeFirst();
                    try {
                        t.channel.register(sel, SelectionKey.OP_CONNECT, t);
                    } catch (IOException x) {
                        t.channel.close();
                        t.failure = x;
                        printer.add(t);
                    }
                }
            }
        }
        void processSelectedKeys() throws IOException {
            for (Iterator i = sel.selectedKeys().iterator(); i.hasNext();) {
                SelectionKey sk = (SelectionKey) i.next();
                i.remove();
                Target t = (Target) sk.attachment();
                SocketChannel sc = (SocketChannel) sk.channel();
                try {
                    if (sc.finishConnect()) {
                        sk.cancel();
                        t.connectFinish = System.currentTimeMillis();
                        sc.close();
                        printer.add(t);
                    }
                } catch (IOException x) {
                    sc.close();
                    t.failure = x;
                    printer.add(t);
                }
            }
        }
        volatile boolean shutdown = false;
        void shutdown() {
            shutdown = true;
            sel.wakeup();
        }
        public void run() {
            for (;;) {
                try {
                    int n = sel.select();
                    if (n > 0)
                        processSelectedKeys();
                    processPendingTargets();
                    if (shutdown) {
                        sel.close();
                        return;
                    }
                } catch (IOException x) {
                    x.printStackTrace();
                }
            }
        }
    }
    public static void main(String[] args) throws InterruptedException,
            IOException {
        args = new String[] { "8888", "192.168.10.193" };
        if (args.length < 1) {
            System.err.println("Usage: java Ping [port] host...");
            return;
        }
        int firstArg = 0;
        if (Pattern.matches("[0-9]+", args[0])) {
            port = Integer.parseInt(args[0]);
            firstArg = 1;
        }
        Printer printer = new Printer();
        printer.start();
        Connector connector = new Connector(printer);
        connector.start();
        LinkedList targets = new LinkedList();
        for (int i = firstArg; i < args.length; i++) {
            Target t = new Target(args[i]);
            targets.add(t);
            connector.add(t);
        }
        Thread.sleep(2000);
        connector.shutdown();
        connector.join();
        for (Iterator i = targets.iterator(); i.hasNext();) {
            Target t = (Target) i.next();
            if (!t.shown)
                t.show();
        }
    }
}
 
二、JAVA调用外部EXE实现PING功能
import java.io.*;
import java.lang.*;

public class Ping {
   
   
    public Ping() {
    }
    public static void main(String args[])
    {
        if (args.length < 1)
        {
            System.out.println("syntax Error!");
        }
        else
        {
            String line = null;
            try
            {
                Process pro = Runtime.getRuntime().exec("ping " + args[0]);
                BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
                while((line = buf.readLine()) != null)
                    System.out.println(line);
            }
            catch(Exception ex)
            {
                System.out.println(ex.getMessage());
            }
        }
       
    }
}
 三、ICMP Ping in Java(JDK 1.5 and above)
Programatically using ICMP Ping is a great way to establish that a server is up and running. Previously you couldn't do ICMP ping (what ping command does in Linux/Unix & Windows) in java without using JNI or exec calls. Here is a simple and reliable method to do ICMP pings in Java without using JNI or NIO.

String host = "172.16.0.2"
int timeOut = 3000; // I recommend 3 seconds at least
boolean status = InetAddress.getByName(host).isReachable(timeOut)

status is true if the machine is reachable by ping; false otherwise. Best effort is made to try to reach the host, but firewalls and server configuration may block requests resulting in a unreachable status while some specific ports may be accessible. A typical implementation will use ICMP ECHO REQUESTs if the privilege can be obtained, otherwise it will try to establish a TCP connection on port 7 (Echo) of the destination host.
In Linux/Unix you may have to suid the java executable to get ICMP Ping working, ECHO REQUESTs will be fine even without suid. However on Windows you can get ICMP Ping without any issues whatsoever.
 
四、最简单的办法,直接调用CMD
try
        {
         Runtime.getRuntime().exec("cmd /c start ping 127.0.0.1");
        }
        catch (Exception ex)
        {
            System.out.println(ex.getMessage());
        }
ping的过程可以显示在本地的办法
import java.io.*;
public class Ping
{
    public static void main(String args[])
    {
        String line = null;
        try
        {
            Process pro = Runtime.getRuntime().exec("ping 127.0.0.1 ");
            BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
            while ((line = buf.readLine()) != null)
                System.out.println(line);
        }
        catch (Exception ex)
        {
            System.out.println(ex.getMessage());
        }
    }
}
 五、模拟PING
    利用InetAddress的isReachable方法可以实现ping的功能,里面参数设定超时时间,返回结果表示是否连上
try {
            InetAddress address = InetAddress.getByName("192.168.0.113");
            System.out.println(address.isReachable(5000));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
六、模拟TELNET
利用Socket的connect(SocketAddress endpoint, int timeout)方法可以实现telnet的功能,如果catch到异常说明telnet失败
try  {
           Socket server = new Socket();
           InetSocketAddress address = new InetSocketAddress("192.168.0.113",
                    8080);
           server.connect(address, 5000);
           server.close();
 

       } catch (UnknownHostException e){
            System.out.println("telnet失败");
        } catch (IOException e){
            System.out.println("telnet失败");
        }
分享到:
评论

相关推荐

    Java实现ping功能

    这个项目名为"Java实现ping功能",它利用Java编程语言,结合Spring Boot、Thymeleaf和Maven等技术,实现了类似操作系统内置ping命令的功能,并且增加了端口检测的特性。下面我们将详细探讨这一项目中的关键知识点。 ...

    用java实现ping功能

    在Java编程中,我们不能直接使用内置的库来实现ping功能,因为Java标准库并不包含这样的功能。但是,我们可以借助第三方库如jpcap(Java Packet Capture)来实现这个功能。 jpcap是一个Java库,它提供了对网络接口...

    java实现的模拟ping功能

    - **`TestPingCmd`类**:这是整个程序的核心类,它包含了一些关键的方法来实现Ping功能。 - `main(String[] args)`方法:程序入口点,用于初始化并启动多线程处理任务。 - `getIpListFromTxt(String filename)`...

    Java简单实现Ping功能.doc

    Java实现ping功能主要涉及到对操作系统命令的调用和并发处理。在Java中,可以通过执行操作系统命令来实现ping操作,这通常使用`Runtime.getRuntime().exec()`或`ProcessBuilder`类来完成。下面详细解释这两种实现...

    用java实现ping的几种方式

    ### 使用Java实现Ping的多种方法 在日常网络管理和软件开发中,经常需要检查网络连通性。`ping`命令作为一种简单而有效的工具被广泛应用于这一领域。本文将介绍几种使用Java来实现`ping`功能的方法。 #### 方法一...

    java实现ping.pdf

    标题“java实现ping.pdf”表明本文档内容与Java编程语言相关,特别是描述了一个实现网络诊断工具“ping”的Java程序。Ping工具主要用于测试数据包是否能够通过网络到达特定的主机,并测量往返时间(Round-Trip Time,...

    基于Java实现PING的服务器端和客户端设计.zip

    资源包含:课程报告word+源码 编程实现PING的服务器端和客户端,实现操作系统提供的ping命令的类似功能。详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/127039936

    基于socket实现Ping功能的源代码

    本文将深入探讨基于Socket实现Ping功能的源代码,涉及到的主要知识点包括Socket编程、原始套接字(SOCK_RAW)以及ICMP(Internet Control Message Protocol)协议。 首先,我们需要理解什么是Socket。Socket是操作...

    java语言实现ping函数的功能

    在Java编程语言中,实现ping功能通常涉及到网络通信和套接字编程。ping命令在网络中主要用于检查网络连接的可达性,其工作原理是发送ICMP(Internet Control Message Protocol)回显请求报文到目标主机,然后接收...

    JAVA 实现 ping

    一段JAVA代码 实现ping功能 import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.nio.channels.SocketChannel;

    java 实现的 ping程序

    总的来说,理解Java实现ping程序涉及到的知识点包括:网络基础知识、ICMP协议、Java套接字编程、UDP数据包的封装与解封,以及可能的JNI技术。通过这个过程,开发者可以深入理解网络通信的底层机制。

    Android中实现ping功能的多种方法详解

    Android中实现ping功能的多种方法详解 Android系统中实现ping功能是 Android开发中的一项重要任务,本文将详细介绍 Android中实现ping功能的多种方法。 方法一:使用InetAddresss方式 从Java 1.5开始,java.net...

    计网课设_Java实现简单的PING操作

    在Java中实现PING功能,主要是通过Java的`InetAddress`类来完成的。 【描述】提到,这个课程设计项目旨在让学生理解并实践如何用Java来模拟PING命令的功能。项目分为两个部分:一是针对单个IP地址的PING操作,二是...

    实现linux java ping 及traceroute 功能.rar

    对于C#开发者来说,虽然核心讨论的是Java实现,但了解如何在C#中实现类似功能也是有益的。在C#中,虽然没有内置的`ping`和`traceroute`实现,但可以使用P/Invoke技术调用Windows API来完成这些任务。例如,可以调用`...

    编程实现基于UDP的PING (Java)

    下面将详细解释基于UDP的PING实现以及相关的Java编程知识。 首先,UDP是传输层的一种无连接协议,它不提供诸如确认、流量控制或重传等服务,因此相对于TCP,UDP更适合于对实时性要求高但可以容忍数据丢失的应用场景...

    rawsocket.rar_java ping 源代码_librocksaw.so_ping_raw socket java_r

    Java实现Ping功能(采用JNI技术),有源码和例子

    TCP-Ping_ping_TCP,IP_JAVAping_java_源码.zip

    解压这个压缩包后,你可以学习和研究如何在实际项目中使用这些代码来实现TCP-Ping功能。这不仅可以帮助你理解TCP/IP通信的细节,还可以让你掌握Java的Socket编程技术。 总之,TCP-Ping是一种基于TCP协议的网络连通...

    javaping.rar_JAVA ping_ping_ping(java)

    这个"javaping.rar"压缩包包含了一个Java实现的ping功能,使得开发者能够在Java应用程序中集成网络检测的能力。下面将详细探讨Java如何实现ping操作以及其背后的原理。 首先,我们要理解原始的ping命令是基于ICMP...

Global site tag (gtag.js) - Google Analytics