From: Miguel A. B. L. <ari...@us...> - 2007-01-08 19:26:23
|
Update of /cvsroot/arianne/marauroa/src/marauroa/server/net/nio In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv15917/src/marauroa/server/net/nio Modified Files: IWorker.java NIONetworkServerManager.java NioServer.java Removed Files: Worker.java Log Message: Many changes for me to remember. Mainly clean ups and documentation. Added some important things to handle "correctly" TCP connection closes. Remove timeout concept as it is not relevant anymore. Index: NIONetworkServerManager.java =================================================================== RCS file: /cvsroot/arianne/marauroa/src/marauroa/server/net/nio/NIONetworkServerManager.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** NIONetworkServerManager.java 18 Dec 2006 21:11:06 -0000 1.5 --- NIONetworkServerManager.java 8 Jan 2007 19:26:14 -0000 1.6 *************** *** 33,36 **** --- 33,37 ---- import marauroa.common.net.NetConst; import marauroa.server.game.Statistics; + import marauroa.server.net.IDisconnectedListener; import marauroa.server.net.INetworkServerManager; import marauroa.server.net.ConnectionValidator; *************** *** 68,71 **** --- 69,73 ---- private Encoder encoder; private Decoder decoder; + public NIONetworkServerManager() throws IOException { *************** *** 90,93 **** --- 92,96 ---- server=new NioServer(null, NetConst.marauroa_PORT, this); + server.registerDisconnectedListener(this); server.start(); } *************** *** 163,174 **** /** Removes the channel from the map when the client disconnect or is disconnected */ ! public void onDisconnect(SocketChannel channel) { ! Socket socket=channel.socket(); ! InetSocketAddress address=new InetSocketAddress(socket.getInetAddress(),socket.getPort()); ! sockets.remove(address); } - public void onData(NioServer server, SocketChannel channel, byte[] data, int count) { byte[] dataCopy = new byte[count]; --- 166,173 ---- /** Removes the channel from the map when the client disconnect or is disconnected */ ! public void onDisconnect(InetSocketAddress address) { sockets.remove(address); } public void onData(NioServer server, SocketChannel channel, byte[] data, int count) { byte[] dataCopy = new byte[count]; *************** *** 220,223 **** --- 219,225 ---- } + public void registerDisconnectedListener(IDisconnectedListener listener) { + server.registerDisconnectedListener(listener); + } @Override *************** *** 295,298 **** } }.start(); ! } } --- 297,300 ---- } }.start(); ! } } --- Worker.java DELETED --- Index: NioServer.java =================================================================== RCS file: /cvsroot/arianne/marauroa/src/marauroa/server/net/nio/NioServer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** NioServer.java 18 Dec 2006 21:11:06 -0000 1.3 --- NioServer.java 8 Jan 2007 19:26:14 -0000 1.4 *************** *** 16,19 **** --- 16,20 ---- import java.net.InetAddress; import java.net.InetSocketAddress; + import java.net.Socket; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; *************** *** 24,27 **** --- 25,30 ---- import java.util.*; + import marauroa.server.net.IDisconnectedListener; + *************** *** 53,56 **** --- 56,61 ---- // Maps a SocketChannel to a list of ByteBuffer instances private Map<SocketChannel,List<ByteBuffer>> pendingData = new HashMap<SocketChannel,List<ByteBuffer>>(); + + private List<IDisconnectedListener> listeners; public NioServer(InetAddress hostAddress, int port, IWorker worker) throws IOException { *************** *** 63,69 **** --- 68,83 ---- this.worker = worker; this.worker.setServer(this); + + listeners=new LinkedList<IDisconnectedListener>(); } public void close(SocketChannel channel) throws IOException { + Socket socket=channel.socket(); + InetSocketAddress address=new InetSocketAddress(socket.getInetAddress(),socket.getPort()); + + for(IDisconnectedListener listener: listeners) { + listener.onDisconnect(address); + } + channel.close(); } *************** *** 181,188 **** // The remote forcibly closed the connection, cancel // the selection key and close the channel. - worker.onDisconnect(socketChannel); - key.cancel(); ! socketChannel.close(); return; } --- 195,202 ---- // The remote forcibly closed the connection, cancel // the selection key and close the channel. key.cancel(); ! ! close(socketChannel); ! return; } *************** *** 191,197 **** // Remote entity shut the socket down cleanly. Do the // same from our end and cancel the channel. ! worker.onDisconnect(socketChannel); - key.channel().close(); key.cancel(); return; --- 205,210 ---- // Remote entity shut the socket down cleanly. Do the // same from our end and cancel the channel. ! close((SocketChannel) key.channel()); key.cancel(); return; *************** *** 247,249 **** --- 260,266 ---- return socketSelector; } + + public void registerDisconnectedListener(IDisconnectedListener listener) { + this.listeners.add(listener); + } } Index: IWorker.java =================================================================== RCS file: /cvsroot/arianne/marauroa/src/marauroa/server/net/nio/IWorker.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** IWorker.java 18 Dec 2006 21:11:06 -0000 1.2 --- IWorker.java 8 Jan 2007 19:26:14 -0000 1.3 *************** *** 15,26 **** import java.nio.channels.SocketChannel; ! public interface IWorker { public abstract void setServer(NioServer server); public abstract void onConnect(SocketChannel socket); - public abstract void onDisconnect(SocketChannel socket); - public abstract void onData(NioServer server, SocketChannel socket, byte[] data, int count); --- 15,26 ---- import java.nio.channels.SocketChannel; + import marauroa.server.net.IDisconnectedListener; ! ! public interface IWorker extends IDisconnectedListener{ public abstract void setServer(NioServer server); public abstract void onConnect(SocketChannel socket); public abstract void onData(NioServer server, SocketChannel socket, byte[] data, int count); |