boolean debug=false, busy_sleep=false, yield=false, loopback=false; Debugger debugger=null;
boolean busy_sleep=false, yield=false, loopback=false;
    public static void main(String[] args) {        DatagramSocket sock=null;        Receiver receiver;        int num_msgs=1000, num_sent=0, group_port=7500, num_yields=0;        DatagramPacket packet;        InetAddress group_addr=null;        int[][] matrix;        boolean jg=false; // use JGroups channel instead of UDP MulticastSocket        JChannel channel=null;        String group_name="SpeedTest-Group";        Message send_msg;        boolean debug=false, busy_sleep=false, yield=false, loopback=false;        Debugger debugger=null;        long sleep_time=1; // sleep in msecs between msg sends        ExposedByteArrayOutputStream output=new ExposedByteArrayOutputStream(64);        String props;        props="UDP(mcast_addr=224.0.0.36;mcast_port=55566;ip_ttl=32;" +                "ucast_send_buf_size=32000;ucast_recv_buf_size=64000;" +                "mcast_send_buf_size=32000;mcast_recv_buf_size=64000):" +                "PING(timeout=2000;num_initial_members=3):" +                "MERGE2(min_interval=5000;max_interval=10000):" +                "FD_SOCK:" +                "VERIFY_SUSPECT(timeout=1500):" +                "pbcast.NAKACK(max_xmit_size=8192;gc_lag=50;retransmit_timeout=600,800,1200,2400,4800):" +                "UNICAST(timeout=1200):" +                "pbcast.STABLE(desired_avg_gossip=10000):" +                "FRAG(frag_size=8192;down_thread=false;up_thread=false):" +                "pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;" +                "shun=false;print_local_addr=true):" +                "pbcast.STATE_TRANSFER";                //  "PERF(details=true)";        for(int i=0; i < args.length; i++) {            if("-help".equals(args[i])) {                help();                return;            }            if("-jg".equals(args[i])) {                jg=true;                continue;            }            if("-loopback".equals(args[i])) {                loopback=true;                continue;            }            if("-props".equals(args[i])) {                props=args[++i];                continue;            }            if("-debug".equals(args[i])) {                debug=true;                continue;            }            if("-busy_sleep".equals(args[i])) {                busy_sleep=true;                continue;            }            if("-yield".equals(args[i])) {                yield=true;                num_yields++;                continue;            }            if("-sleep".equals(args[i])) {                sleep_time=Long.parseLong(args[++i]);                continue;            }            if("-num_msgs".equals(args[i])) {                num_msgs=Integer.parseInt(args[++i]);                continue;            }            help();            return;        }        System.out.println("jg       = " + jg +                "\nloopback = " + loopback +                "\ndebug    = " + debug +                "\nsleep    = " + sleep_time +                "\nbusy_sleep=" + busy_sleep +                "\nyield=" + yield +                "\nnum_yields=" + num_yields +                "\nnum_msgs = " + num_msgs +                           '\n');        try {            matrix=new int[num_msgs][2];            for(int i=0; i < num_msgs; i++) {                for(int j=0; j < matrix[i].length; j++)                    matrix[i][j]=0;            }            if(jg) {                if(loopback) {                    ProtocolStackConfigurator conf=ConfiguratorFactory.getStackConfigurator(props);                    String tmp=conf.getProtocolStackString();                    int index=tmp.indexOf(':');                    props=LOOPBACK + tmp.substring(index);                }                channel=new JChannel(props);                // System.out.println("props:\n" + channel.getProperties());                channel.connect(group_name);                if(debug) {                    debugger=new Debugger(channel);                    debugger.start();                }            }            else {                group_addr=InetAddress.getByName("224.0.0.36");                sock=new DatagramSocket();            }            if(debug) {                System.out.println("Press key to start");                System.in.read();            }            receiver=new Receiver(group_addr, group_port, channel, matrix, jg);            receiver.start();            byte[] buf;            DataOutputStream out;            start=System.currentTimeMillis();            for(int i=0; i < num_msgs; i++) {                // buf=Util.objectToByteBuffer(new Integer(i));                output.reset();                out=new DataOutputStream(output);                out.writeInt(i);                out.flush();                buf=output.getRawBuffer();                out.close();                if(jg) {                    send_msg=new Message(null, null, buf, 0, buf.length);                    channel.send(send_msg);                }                else {                    packet=new DatagramPacket(buf, buf.length, group_addr, group_port);                    sock.send(packet);                }                num_sent++;                if(num_sent % 1000 == 0)                    System.out.println("-- sent " + num_sent);                matrix[i][0]=1;                if(yield) {                    for(int k=0; k < num_yields; k++) {                        Thread.yield();                    }                }                else {                    if(sleep_time > 0) {                        sleep(sleep_time, busy_sleep);                    }                }            }            while(true) {                System.in.read();                printMatrix(matrix);            }        }        catch(Exception ex) {            ex.printStackTrace();            System.exit(-1);        }    }