Mercurial > hg > RemoteEditor > REPSessionManager
view rep/FirstConnector.java @ 356:b18c24dcc5d2
Before chaning put/join scheme for ditributed select.
author | kono |
---|---|
date | Sat, 18 Oct 2008 19:01:40 +0900 |
parents | 98607350f7d1 |
children | 034acadc0cdc |
line wrap: on
line source
package rep; import java.io.IOException; import rep.channel.REPSelectionKey; import rep.channel.REPSocketChannel; public class FirstConnector extends Forwarder { public FirstConnector(SessionManager manager) { super(manager); } public void cancel(REPSocketChannel<REPCommand> socketChannel) { manager.remove(socketChannel); } public void handle(REPSelectionKey<REPCommand> key) throws Exception { /* * 接続要求は、EditorかSlave Editorで、 * join, put, sm_join * が来る。それ以外はエラー。master もありか? * sm_join_ack */ Forwarder fw; REPSocketChannel<REPCommand> channel = key.channel1(); REPCommand command = channel.read(); SessionManager.logger.writeLog("FirstConnector: command = " + command); switch(command.cmd) { case SMCMD_JOIN: { //どのSessionにも属さないエディタをリストに追加 //エディタとchannelは1対1 (ではない) //エディタが新しくputする場合は新しくソケットを作る // 1対1でない場合は、multiplexerを挿めば良い // ここのeditorList はsessionのとは別物 Editor editor = new Editor(manager,-1,channel); editor.setHost(manager.myHost); manager.editorList.add(editor); fw = editor; break; } case SMCMD_PUT: { // put の場合でも、eid は、masterまで聞きにいく必要が // ある。 Editor editor = new Editor(manager,0,channel); editor.setHost(manager.myHost); manager.editorList.add(editor); fw = editor; break; } case SMCMD_SM_JOIN: { fw = new Forwarder(manager); manager.smList.addWaitingSessionManager(fw, command); break; } case SMCMD_SM_JOIN_ACK: manager.setSessionManagerID(command.sid); fw = new Forwarder(manager); break; default: throw new IOException(); } //myHost を設定。 //立ち上げ時にやるとlocalhostしか取れない if(manager.myHost == null) manager.setMyHostName(getLocalHostName()); fw.setMode(command.cmd); manager.registerChannel(channel, fw); manager.sessionManage(fw, command); } }