/**
*
*/
package org.ml.pr0708.da;
import java.io.IOException;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.Channel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.LinkedList;
import org.ml.pr0708.da.SyncServer.ServerThread;
/**
* @author loreti
*
*/
public class AsyncServer implements Server {
private static int RETRY=10;
private LinkedList<Packet> queue;
private SocketAddress address;
private PacketFactory factory;
public AsyncServer( PacketFactory factory , SocketAddress address ) {
this.address = address;
this.queue = new LinkedList<Packet>();
this.factory = factory;
}
private synchronized void addPacket( Packet p ) {
queue.add(p);
notifyAll();
}
while (true) {
for (Packet b : queue) {
if (p.match(b)) {
queue.remove(b);
return ;
}
}
wait();
}
}
public void send
( Packet p , SocketAddress dest
) throws IOException { boolean flag = true;
SocketChannel c = null;
while (flag) {
try {
c = SocketChannel.open(dest);
flag = false;
}
}
ByteBuffer b = p.createBuffer();
c.write(b);
c.close();
}
public void start() {
try {
Selector selector = Selector.open();
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
ssc.socket().bind(address);
ssc.register(selector, SelectionKey.OP_ACCEPT);
t.start();
e.printStackTrace();
}
}
public class ServerThread
implements Runnable {
private Selector selector;
public ServerThread(Selector selector) {
this.selector = selector;
}
public void run() {
try {
while (true) {
selector.select();
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = it.next();
it.remove();
handleKey( key );
}
}
e.printStackTrace();
}
}
private void handleKey
(SelectionKey key
) throws IOException { if (key.isValid()&&key.isAcceptable()) {
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel client = ssc.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
return ;
}
if (key.isValid()&&key.isReadable()) {
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer b = factory.getByteBuffer();
client.read(b);
b.flip();
addPacket(factory.createPacket(b));
client.close();
}
}
}
}