Mercurial > hg > FederatedLinda
view src/fdl/FDLindaServ.java @ 21:fac6e0073b1a meta-engine-written
*** empty log message ***
author | kono |
---|---|
date | Tue, 19 Aug 2008 10:48:22 +0900 |
parents | a0fd653d1121 |
children | 56e015e8f5dc |
line wrap: on
line source
package fdl; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.channels.ClosedChannelException; import java.nio.channels.SelectionKey; import java.nio.channels.ServerSocketChannel; import java.nio.channels.spi.AbstractSelector; import java.nio.channels.spi.SelectorProvider; public class FDLindaServ { static final int MAX_REQ = 1; static final int FAIL = (-1); static final int DEF_PORT = 10000; //public static final int TIMEOUT = 5*1000; public int port = DEF_PORT; private AbstractSelector selector; private ServerSocketChannel ssChannel; public TupleSpace tupleSpace; public static void main(final String[] args) { final String usages = "usage: FDLindaServ [-p port]"; //バイトオーダー確認 //System.out.println(ByteOrder.nativeOrder().toString()); int port = DEF_PORT; //引数判定 try { for (int i=0; i<args.length; ++i) { if("-p".equals(args[i])) { port = Integer.parseInt(args[++i]); } } } catch (NumberFormatException e) { System.err.println(usages); return; } try { FDLindaServ serv; serv = new FDLindaServ(port); serv.mainLoop(); } catch (IOException e) { System.err.println("Server Communiation Problem."); } } private void mainLoop() { MetaLinda ml = new MetaLinda(tupleSpace, this); MetaEngine me = new NullMetaEngine(ml); // MetaEngine me = new MetaEngine(ml); while(true) { me.mainLoop(); } } public FDLindaServ(int port) throws IOException { this.port = port; //セレクタを生成 selector = SelectorProvider.provider().openSelector(); //ソケット・チャネルを生成・設定 ssChannel = SelectorProvider.provider().openServerSocketChannel(); InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), port); ssChannel.socket().bind(address); ssChannel.configureBlocking(false); //ssChannel.socket().setReuseAddress(true); System.out.println("Server: litening at "+ssChannel); //セレクタにチャンネルを登録 tupleSpace = new TupleSpace(); ssChannel.register(selector, SelectionKey.OP_ACCEPT, new AcceptHandler(tupleSpace)); } public void checkTuple() { // セレクタによる監視 try { if (selector.select()>0) { for(SelectionKey s:selector.selectedKeys()) { TupleHandler handler = (TupleHandler)s.attachment(); handler.handle(s); } } } catch (ClosedChannelException e) { // we have to do something... } catch (IOException e) { } } public void checkTuple(long timeout) { // セレクタによる監視 try { if (selector.select(timeout)>0) { for(SelectionKey s:selector.selectedKeys()) { TupleHandler handler = (TupleHandler)s.attachment(); handler.handle(s); } } } catch (ClosedChannelException e) { // we have to do something... } catch (IOException e) { } } }