package org.jgroups.tests;
import org.jgroups.logging.Log;
import org.jgroups.logging.LogFactory;
import org.jgroups.util.Util;
import java.io.IOException;
import java.net.*;
/**
* Simple protocol to test round trip times. Requests are [PING], responses are [PONG]. Start multiple instances
* and press <return> to get the round trip times for all nodes in the cluster, This program doesn't use JGroups at all,
* see {@link org.jgroups.tests.PingPong} for a comparison.
* @author Bela Ban
*/
public class PingPongDatagram {
MulticastSocket mcast_sock;
static final SocketAddress MCAST_GROUP;
Log log=LogFactory.getLog(PingPongDatagram.class);
static final byte PING = 1;
static final byte PONG = 2;
static final byte[] PING_REQ={PING};
static final byte[] PONG_RSP={PONG};
long start=0;
static {
MCAST_GROUP=new InetSocketAddress("239.5.5.5", 7500);
}
public void start() throws Exception {
mcast_sock=new MulticastSocket(7500);
mcast_sock.joinGroup(MCAST_GROUP, NetworkInterface.getByName("192.168.1.5"));
Receiver receiver=new Receiver();
receiver.start();
while(true) {
Util.keyPress("enter to ping");
DatagramPacket packet=new DatagramPacket(PING_REQ, 0, PING_REQ.length, MCAST_GROUP);
start=System.nanoTime();
mcast_sock.send(packet);
}
}
class Receiver extends Thread {
byte[] buf=new byte[1];
public void run() {
while(true) {
DatagramPacket packet=new DatagramPacket(buf, 0, buf.length);
try {
mcast_sock.receive(packet);
SocketAddress sender=packet.getSocketAddress();
byte type=packet.getData()[0];
switch(type) {
case PING:
DatagramPacket rsp=new DatagramPacket(PONG_RSP, 0, PONG_RSP.length, MCAST_GROUP);
mcast_sock.send(rsp);
break;
case PONG:
long rtt=System.nanoTime() - start;
double ms=rtt / 1000.0 / 1000.0;
System.out.println("RTT for " + sender + ": " + Util.format(ms) + " ms");
break;
default:
System.err.println("type " + type + " unknown");
}
}
catch(IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws Exception {
new PingPongDatagram().start();
}
}