package org.jgroups.tests.rt.transports; import org.jgroups.Address; import org.jgroups.Global; import org.jgroups.blocks.cs.*; import org.jgroups.logging.Log; import org.jgroups.logging.LogFactory; import org.jgroups.tests.rt.RtReceiver; import org.jgroups.tests.rt.RtTransport; import org.jgroups.util.Bits; import org.jgroups.util.Util; import java.io.DataInput; import java.net.InetAddress; import java.util.List; /** * @author Bela Ban * @since 4.0 */ public class ServerTransport extends ReceiverAdapter implements RtTransport { protected BaseServer srv; protected RtReceiver receiver; protected InetAddress host; protected int port=7800; protected boolean server, nio; protected final Log log=LogFactory.getLog(ServerTransport.class); public ServerTransport() { } public String[] options() { return new String[]{"-host <host>", "-port <port>", "-server", "-nio"}; } public void options(String... options) throws Exception { if(options == null) return; for(int i=0; i < options.length; i++) { if(options[i].equals("-server")) { server=true; continue; } if(options[i].equals("-host")) { host=InetAddress.getByName(options[++i]); continue; } if(options[i].equals("-port")) { port=Integer.parseInt(options[++i]); continue; } if(options[i].equals("-nio")) { nio=true; } } if(host == null) host=InetAddress.getLocalHost(); } public void receiver(RtReceiver receiver) { this.receiver=receiver; } public Object localAddress() { return null; } public List<Object> clusterMembers() { return null; } public void start(String ... options) throws Exception { options(options); if(server) { srv=nio? new NioServer(host, port) : new TcpServer(host, port); srv.connExpireTimeout(0); srv.tcpNodelay(false); srv.receiver(this); srv.start(); System.out.printf("server started on %s (ctrl-c to terminate)\n", srv.localAddress()); } else { srv=nio? new NioClient(null, 0, host, port) : new TcpClient(null, 0, host, port); srv.tcpNodelay(false); srv.receiver(this); srv.start(); } } public void stop() { Util.close(this.srv); } public void send(Object dest, byte[] buf, int offset, int length) throws Exception { byte[] buffer=new byte[length+Global.INT_SIZE]; Bits.writeInt(length, buffer, 0); System.arraycopy(buf, 0, buffer, Global.INT_SIZE, length); srv.send((Address)dest, buffer, 0, buffer.length); } public void receive(Address sender, byte[] buf, int offset, int length) { if(receiver != null) { int len=Bits.readInt(buf, offset); receiver.receive(sender, buf, offset+ Global.INT_SIZE, len); } } public void receive(Address sender, DataInput in) throws Exception { if(receiver == null) return; int len=in.readInt(); byte[] buf=new byte[len]; in.readFully(buf); receiver.receive(sender, buf, 0, buf.length); } }