三九宝宝网宝宝百科宝宝知识

纯Java实现ICMP的ping命令

11月16日 编辑 39baobao.com

[大班计划:将想法变成计划,努力去实现]年年岁岁,岁岁年年。一晃眼,我带的我们班的孩子来到了大班。总想和孩子们一起有点什么作为,却一直平平淡淡着。我们平平淡淡的快乐着,平平淡淡的玩耍着。今年,是我的孩子们在学...+阅读

import ja.io.*;

import ja..*;

import ja.nio.channels.*;

import ja.util.*;

import ja.util.regex.*;

public class Ping {

static int DAYTIME_PORT = 13;

static int port = DAYTIME_PORT;

static class Target {

ISocketAddress address;

SocketChannel channel;

Exception failure;

long connectStart;

long connectFinish = 0;

boolean shown = false;

Target(String host) {

try {

address = new ISocketAddress(IAddress.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.f

ailure = 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: ja 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();

}

}

}

以下为关联文档:

学习新知识不断完善知识体系,从而实现长期有效的学习人生本就是个需要长期学习的过程,尤其是现今社会,已经处于知识经济的时代,不学习一定会落后。如果说学习是一场持久战,那么如何在这场战役中时刻保持战斗力,需要什么样的心态,确实...

高考最后复习冲刺阶段,如何实现数学的逆袭作者 纸盆1、基础知识不牢固数学有80%的题目是考察我们基础孩子是的,其实只要我们基础知识扎实,那么我们数学能轻松考100+,而数学经常考不好,基本是基础不扎实导致的,所以要...

如何实现大学的目标和计划准大学生们就带着大学录取通知书的船票,乘坐大学的远洋船,航行在知识的海洋里了。可是,那么多的学生,又有多少能顺利到达理想之岸呢?上大学之前,各位学子做好准备了吗?如何实现...

优化师生资源,实现教学相长(一)发挥教师在课堂上的作用, 教师的亲和力和人格魅力是激发学生积极情感的动力源之一。一位优秀的语文教师,能在课堂上身体力行地进行语言表达能力和语言交流的示范,以正确流...

浅谈在英语课堂中如何实现学生的主体性【摘要】在倡导以生为本的大势之下,让学生成为课堂的主人,人人都成为活动主体,就要求我们老师放下主导权,转型成为引导者。教师在课堂教学中要做到:鼓励学生主动参与探索;引导学生...

如何快速实现雅思听力如何快速实现雅思听力招数一 走出过去的误区大部分考过雅思听力的考生都会有过这样的观念:听力文章都听懂才能答好题的。不说所有内容都听懂,但至少证80%或者再少点70%能听...

不怕挫折和失败,我的理想就会实现理想,对于小时候的我来说,是个很空泛的话题。我一会想当这个,一会想当那个,总也确定不下来。但是,我大一点的时候,跟着父母去看了一次画展,我被那些画深深的吸引住了,它们真是太精...

要想成为好父母,必须努力实现六个转变做为家长,多年来我一直在寻求教育孩子的灵丹妙药,也在摸索中逐步形成了自己的一些教育方法。但读完《给孩子最好的家庭教育》这本书,我深感震撼:自己的很多方法都是欠妥甚至是错...

不用命令口吻说话当今社会,孩子大多是独生子女,在家中是 小皇帝 小公主 ,相称一部分孩子在家里金口玉牙,与本身的怙恃发言也用敕令的口吻,许多孩子把如许的不良习气也带到了幼儿园。 在地区运动时...

推荐阅读
图文推荐