public void run()
{
System.out.println("Selector Started");
int totalKeys = 0;
Iterator<SelectionKey> iter;
SelectionKey key;
MMOConnection<T> con;
FastList.Node<MMOConnection<T>> n, end, temp;
// main loop
for (;;)
{
// check for shutdown
if (this.isShuttingDown())
{
this.closeSelectorThread();
break;
}
try
{
totalKeys = this.getSelector().selectNow();
}
catch (IOException e)
{
//TODO logging
e.printStackTrace();
}
//System.out.println("Selector Selected "+totalKeys);
if (totalKeys > 0)
{
Set<SelectionKey> keys = this.getSelector().selectedKeys();
iter = keys.iterator();
while (iter.hasNext())
{
key = iter.next();
iter.remove();
switch (key.readyOps())
{
case SelectionKey.OP_CONNECT:
this.finishConnection(key);
break;
case SelectionKey.OP_ACCEPT:
this.acceptConnection(key); // <----- remove con
break;
case SelectionKey.OP_READ:
this.readPacket(key);
break;
case SelectionKey.OP_WRITE:
this.writePacket(key);
break;
case SelectionKey.OP_READ | SelectionKey.OP_WRITE:
this.writePacket(key);
// key might have been invalidated on writePacket
if (key.isValid())
this.readPacket(key);
break;
}
}
}
// process pending close
for (n = this.getPendingClose().head(), end = this.getPendingClose().tail(); (n = n.getNext()) != end;)
{
con = n.getValue();
if (con.getSendQueue().isEmpty())
{
temp = n.getPrevious();
this.getPendingClose().delete(n);
n = temp;
this.closeConnectionImpl(con);
}
}
try
{
Thread.sleep(1);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
protected void acceptConnection(SelectionKey key)
{
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel sc;
try
{
if((sc = ssc.accept()) != null)
{
while (true)
{
if(this.getAcceptFilter() == null || this.getAcceptFilter().accept(sc))
{
//configure
sc.configureBlocking(false);
sc.socket().setTrafficClass(0);
sc.socket().setTcpNoDelay(false);
sc.socket().setKeepAlive(false);
SelectionKey clientKey = sc.register(this.getSelector(), SelectionKey.OP_READ);
clientKey.attach(this.getClientFactory().create(new MMOConnection<T>(this, sc, clientKey)));
}
else
{
sc.socket().close();
}
}
}
else
{
System.out.println("Made in attack server for modifications divane.");
}
}
catch (IOException e)
{
e.printStackTrace();
}
}