pingclient java_Java实现Ping

二、通过指定服务器去ping测试

主要思路:利用Mina在指定的第三方服务器上运行server端,然后实现客户端和 第三方 服务器建立socket连接,发送ping任务的消息给第三方服务器,第三方服务器再把执行结果实时反馈给客户端。

代码包括四个类:

服务端:PingServerIoHandler.java PingServer.java

客户端:PingClientIoHandler.java PingClient.java

package michael.mina.ping;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.LineNumberReader;

import java.text.MessageFormat;

import org.apache.mina.core.service.IoHandlerAdapter;

import org.apache.mina.core.session.IdleStatus;

import org.apache.mina.core.session.IoSession;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

public class PingServerIoHandler extends IoHandlerAdapter {

private String logId = "SERVER:: ";

private int msgCount = 0;

@Override

public void exceptionCaught(IoSession pSession, Throwable pCause)

throws Exception {

System.out.println(logId + "发生异常:" + pCause.getLocalizedMessage());

}

@Override

public void messageReceived(IoSession pSession, Object pMessage)

throws Exception {

String msg = String.valueOf(pMessage);

msgCount++;

System.out.println(logId + "收到客户端第 " + msgCount + " 条消息:" + msg);

pSession.write(msgCount);

if (msg.startsWith("ping")) {

String destIp = msg.split(" ")[1];

doPingCmd(pSession, destIp);

}

}

@Override

public void messageSent(IoSession pSession, Object pMessage)

throws Exception {

System.out.println(logId + "发出消息:" + pMessage);

}

@Override

public void sessionClosed(IoSession pSession) throws Exception {

System.out.println(logId + "one client closed ");

}

@Override

public void sessionCreated(IoSession pSession) throws Exception {

System.out.println(logId + "sessionCreated ");

}

@Override

public void sessionIdle(IoSession pSession, IdleStatus pStatus)

throws Exception {

super.sessionIdle(pSession, pStatus);

}

@Override

public void sessionOpened(IoSession pSession) throws Exception {

System.out.println(logId + "sessionOpened ");

}

private Integer doPingCmd(IoSession pSession, String destIp) {

LineNumberReader input = null;

int maxCount = 4;

try {

String osName = System.getProperties().getProperty("os.name");

String pingCmd = null;

if (osName.startsWith("Windows")) {

pingCmd = "cmd /c ping -n {0} {1}";

pingCmd = MessageFormat.format(pingCmd, maxCount, destIp);

} else if (osName.startsWith("Linux")) {

pingCmd = "ping -c {0} {1}";

pingCmd = MessageFormat.format(pingCmd, maxCount, destIp);

} else {

System.out.println("not support OS");

return null;

}

Process process = Runtime.getRuntime().exec(pingCmd);

InputStreamReader ir = new InputStreamReader(process

.getInputStream());

input = new LineNumberReader(ir);

String line;

while ((line = input.readLine()) != null) {

if (!"".equals(line)) {

pSession.write(line);

}

}

} catch (IOException e) {

System.out.println("IOException   " + e.getMessage());

} finally {

if (null != input) {

try {

input.close();

} catch (IOException ex) {

System.out.println("close error:" + ex.getMessage());

}

}

}

return null;

}

}

package michael.mina.ping;

import java.net.InetSocketAddress;

import java.nio.charset.Charset;

import org.apache.mina.core.service.IoAcceptor;

import org.apache.mina.filter.codec.ProtocolCodecFilter;

import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

import org.apache.mina.filter.logging.LoggingFilter;

import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

public class PingServer {

private static final int PORT = 54321;

/**

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

IoAcceptor acceptor = new NioSocketAcceptor();

acceptor.getFilterChain().addLast("logger", new LoggingFilter());

acceptor.getFilterChain().addLast(

"codec",

new ProtocolCodecFilter(new TextLineCodecFactory(Charset

.forName("UTF-8"))));

acceptor.setHandler(new PingServerIoHandler());

acceptor.bind(new InetSocketAddress(PORT));

System.out.println("服务端已启动,监听端口:" + PORT);

}

}

package michael.mina.ping;

import org.apache.mina.core.service.IoHandlerAdapter;

import org.apache.mina.core.session.IdleStatus;

import org.apache.mina.core.session.IoSession;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

public class PingClientIoHandler extends IoHandlerAdapter {

private String logId = "CLIENT:: ";

@Override

public void exceptionCaught(IoSession pSession, Throwable pCause)

throws Exception {

System.out.println(logId + "发生异常:" + pCause.getLocalizedMessage());

}

@Override

public void messageReceived(IoSession pSession, Object pMessage)

throws Exception {

String count = String.valueOf(pMessage);

System.out.println(logId + "服务端收到的消息数 = " + count);

}

@Override

public void messageSent(IoSession pSession, Object pMessage)

throws Exception {

System.out.println(logId + "发出消息:" + pMessage);

}

@Override

public void sessionClosed(IoSession pSession) throws Exception {

System.out.println(logId + "one client closed ");

}

@Override

public void sessionCreated(IoSession pSession) throws Exception {

System.out.println(logId + "sessionCreated ");

}

@Override

public void sessionIdle(IoSession pSession, IdleStatus pStatus)

throws Exception {

super.sessionIdle(pSession, pStatus);

}

@Override

public void sessionOpened(IoSession pSession) throws Exception {

System.out.println(logId + "sessionOpened ");

}

}

package michael.mina.ping;

import java.net.InetSocketAddress;

import java.nio.charset.Charset;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;

import org.apache.mina.core.future.ConnectFuture;

import org.apache.mina.core.session.IoSession;

import org.apache.mina.filter.codec.ProtocolCodecFilter;

import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

import org.apache.mina.transport.socket.SocketConnector;

import org.apache.mina.transport.socket.nio.NioSocketConnector;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

public class PingClient {

private static final int PORT = 54321;

/**

* IP列表

* @param ipList

*/

public void createPingClient(List ipList) {

SocketConnector connector = new NioSocketConnector();Linux停止系统运行不关闭电源命令halt

DefaultIoFilterChainBuilder chain = connector.getFilterChain();

// 设定过滤器一行一行读取数据

chain.addLast("codec", new ProtocolCodecFilter(

new TextLineCodecFactory(Charset.forName("UTF-8"))));

// 注册消息处理器

connector.setHandler(new PingClientIoHandler());

connector.setConnectTimeoutMillis(30 * 1000L);

// 连接服务器

ConnectFuture cf = connector.connect(new InetSocketAddress("127.0.0.1",

54321));

cf.awaitUninterruptibly();

IoSession session = cf.getSession();

for (String ip : ipList) {

session.write("ping " + ip);

}

session.getCloseFuture().awaitUninterruptibly();

connector.dispose();

System.out.println("-------------------");

}

/**

* 控制台输入

* @param ipList

*/

public void createPingClient() {

SocketConnector connector = new NioSocketConnector();

DefaultIoFilterChainBuilder chain = connector.getFilterChain();

// 设定过滤器一行一行读取数据

chain.addLast("codec", new ProtocolCodecFilter(

new TextLineCodecFactory(Charset.forName("UTF-8"))));

// 注册消息处理器

connector.setHandler(new PingClientIoHandler());

connector.setConnectTimeoutMillis(30 * 1000L);

// 连接服务器

ConnectFuture cf = connector.connect(new InetSocketAddress("127.0.0.1",

54321));

cf.awaitUninterruptibly();

IoSession session = cf.getSession();

Scanner input = new Scanner(System.in).useDelimiter("\\r\\n");

while (input.hasNext()) {

String s = input.next();

if (s.equals("quit")) {

break;

}

session.write(s);

}

// cf.getSession().getCloseFuture().awaitUninterruptibly();

connector.dispose();

}

/**

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

PingClient tester = new PingClient();

List iplist = new ArrayList();

iplist.add("192.168.8.89");

iplist.add("192.168.8.93");

iplist.add("192.168.8.109");

iplist.add("192.168.8.117");

iplist.add("192.168.8.118");

tester.createPingClient(iplist);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值