package jane.test;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.StandardSocketOptions;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
import jane.core.Log;
import jane.test.net.ByteBufferPool;
import jane.test.net.TcpManager;
import jane.test.net.TcpSession;
// start.bat jane.test.TestEchoAio 32 3200000 10
public final class TestEchoAio extends TcpManager
{
private static int TEST_ECHO_SIZE = 32;
private static int TEST_ECHO_SIZE_ALL = 3200000;
private static int TEST_CLIENT_COUNT = 10;
private static CountDownLatch _closedCount;
public static final class SessionContext
{
public final AtomicInteger recvSize = new AtomicInteger();
public final AtomicInteger sendSize = new AtomicInteger();
}
@Override
public int onChannelCreated(AsynchronousSocketChannel channel, Object attachment) throws IOException
{
super.onChannelCreated(channel, attachment);
channel.setOption(StandardSocketOptions.TCP_NODELAY, true);
return 0;
}
@Override
public void onSessionCreated(TcpSession session)
{
SessionContext ctx = new SessionContext();
session.setUserObject(ctx);
byte[] buf = new byte[TEST_ECHO_SIZE];
for(int i = 0; i < 100; ++i)
{
ByteBuffer bb = ByteBufferPool.def().allocateDirect(TEST_ECHO_SIZE);
bb.put(buf);
bb.flip();
session.send(bb);
ctx.sendSize.addAndGet(TEST_ECHO_SIZE);
}
}
@Override
public void onSessionClosed(TcpSession session, int reason)
{
_closedCount.countDown();
}
@Override
public void onReceived(TcpSession session, ByteBuffer bb)
{
int size = bb.limit();
SessionContext ctx = (SessionContext)session.getUserObject();
int recvSize = ctx.recvSize.addAndGet(size);
int sendSize = ctx.sendSize.get();
if(sendSize < TEST_ECHO_SIZE_ALL)
{
ByteBuffer bbSend = ByteBufferPool.def().allocateDirect(size);
bb.limit(size);
bbSend.put(bb);
bbSend.flip();
ctx.sendSize.addAndGet(size);
session.send(bbSend);
}
else if(recvSize >= sendSize)
session.close();
}
public static void main(String[] args)
{
try
{
if(args.length > 0) TEST_ECHO_SIZE = Integer.parseInt(args[0]);
if(args.length > 1) TEST_ECHO_SIZE_ALL = Integer.parseInt(args[1]);
if(args.length > 2) TEST_CLIENT_COUNT = Integer.parseInt(args[2]);
Log.log.info("TestEchoAio: start({})", TEST_CLIENT_COUNT);
_closedCount = new CountDownLatch(TEST_CLIENT_COUNT * 2);
// System.gc();
long time = System.currentTimeMillis();
@SuppressWarnings("resource")
TestEchoAio mgr = new TestEchoAio();
mgr.startServer(new InetSocketAddress("0.0.0.0", 9123));
for(int i = 0; i < TEST_CLIENT_COUNT; ++i)
mgr.startClient(new InetSocketAddress("127.0.0.1", 9123));
_closedCount.await();
Log.log.info("TestEchoAio: end ({} ms)", System.currentTimeMillis() - time);
Log.shutdown();
// System.out.println(ByteBufferPool.allocCount.get());
// System.out.println(ByteBufferPool.cacheCount.get());
// System.out.println(ByteBufferPool.offerCount.get());
System.exit(0);
}
catch(Throwable e)
{
Log.log.error("startup exception:", e);
e.printStackTrace(System.err);
}
}
}