# HG changeset patch # User pin # Date 1193727122 -32400 # Node ID 2d4c2c19d2d071f07204099f8826644011ac6c55 # Parent b774b87cc2c1090230d28ed6051cae6336f46161 *** empty log message *** diff -r b774b87cc2c1 -r 2d4c2c19d2d0 rep/EditorChannel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rep/EditorChannel.java Tue Oct 30 15:52:02 2007 +0900 @@ -0,0 +1,28 @@ +package rep; + +import java.nio.channels.SocketChannel; +import java.nio.channels.spi.SelectorProvider; + +public abstract class EditorChannel extends SocketChannel { + + protected EditorChannel(SelectorProvider provider) { + super(provider); + } + + private REPPacketSend repsend; + private REPPacketReceive reprec; + + public void putPacket(REPCommand comm){ + repsend.send(comm); + } + public REPCommand getPacket(){ + REPCommand command = reprec.unpack(); + return command; + } + + public void setIO(SocketChannel channel) { + repsend = new REPPacketSend(channel); + reprec = new REPPacketReceive(channel); + } + +} diff -r b774b87cc2c1 -r 2d4c2c19d2d0 rep/SelectableEditorChannel.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rep/SelectableEditorChannel.java Tue Oct 30 15:52:02 2007 +0900 @@ -0,0 +1,85 @@ +package rep; + +import java.io.IOException; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.SelectableChannel; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.SocketChannel; +import java.nio.channels.spi.SelectorProvider; + +public class SelectableEditorChannel extends SelectableChannel{ + + private SocketChannel channel; + private REPPacketSend repsend; + private REPPacketReceive reprec; + + public SelectableEditorChannel(SocketChannel channel){ + this.channel = channel; + repsend = new REPPacketSend(channel); + reprec = new REPPacketReceive(channel); + + } + + @Override + public Object blockingLock() { + return channel.blockingLock(); + //return null; + } + + @Override + public SelectableChannel configureBlocking(boolean block) throws IOException { + return channel.configureBlocking(block); + //return null; + } + + @Override + public boolean isBlocking() { + + return channel.isBlocking(); + } + + @Override + public boolean isRegistered() { + return channel.isRegistered(); + } + + @Override + public SelectionKey keyFor(Selector sel) { + return channel.keyFor(sel); + } + + @Override + public SelectorProvider provider() { + return channel.provider(); + } + + @Override + public SelectionKey register(Selector sel, int ops, Object att) throws ClosedChannelException { + return channel.register(sel, ops, att); + } + + @Override + public int validOps() { + return channel.validOps(); + } + + @Override + protected void implCloseChannel() throws IOException { + + } + + public void putPacket(REPCommand comm){ + repsend.send(comm); + } + public REPCommand getPacket(){ + REPCommand command = reprec.unpack(); + return command; + } + + //public void setIO(SocketChannel channel) { + // repsend = new REPPacketSend(channel); + // reprec = new REPPacketReceive(channel); + //} + +} diff -r b774b87cc2c1 -r 2d4c2c19d2d0 rep/Session.java --- a/rep/Session.java Fri Oct 19 15:34:27 2007 +0900 +++ b/rep/Session.java Tue Oct 30 15:52:02 2007 +0900 @@ -9,6 +9,7 @@ private int sessionID; private String sessionName; private LinkedList editorList = new LinkedList(); + public Session(int sessionID, String string, SocketChannel channel) { masterEditor = new Editor(sessionID, channel); this.sessionID = sessionID; diff -r b774b87cc2c1 -r 2d4c2c19d2d0 rep/SessionList.java --- a/rep/SessionList.java Fri Oct 19 15:34:27 2007 +0900 +++ b/rep/SessionList.java Tue Oct 30 15:52:02 2007 +0900 @@ -35,6 +35,7 @@ //sessions.add(new LinkedList()); //return sessions2.size(); session3.put(sessionID, new Session(sessionID, string, channel)); + //addEditor(channel, sid, command); return sessionID; } @@ -44,6 +45,7 @@ //editorCount++; //sessions.get(sid-1).add(channel); //sessions2.get(sid).add(channel); + if(session3.get(sid) == null) System.out.println("ぬるぽ!"); session3.get(sid).addEditor(editorID, channel); } @@ -77,6 +79,7 @@ for(Editor editor : editorList){ SocketChannel channel2 = editor.getChannel(); if(channel.equals(channel2)){ + System.out.println("equals"); channelequals = true; }else if(channelequals){ repsend = new REPPacketSend(channel2); @@ -126,6 +129,10 @@ }else{ editor3 = editorList.get(editorList.indexOf(editor2)+1); } + if(editor3 != null){ + REPPacketSend send = new REPPacketSend(editor3.getChannel()); + send.send(repCmd); + } } public void addEditor(SocketChannel editorChannel, int sid, int eid) { diff -r b774b87cc2c1 -r 2d4c2c19d2d0 rep/SessionManager.java --- a/rep/SessionManager.java Fri Oct 19 15:34:27 2007 +0900 +++ b/rep/SessionManager.java Tue Oct 30 15:52:02 2007 +0900 @@ -2,15 +2,11 @@ import java.io.IOException; import java.net.InetSocketAddress; -import java.net.ServerSocket; -import java.nio.ByteBuffer; import java.nio.channels.SelectableChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; -import java.nio.charset.Charset; -import java.util.Iterator; //+-------+--------+--------+-------+--------+---------+------+ //| cmd | session| editor | seqid | lineno | textsiz | text | @@ -54,7 +50,7 @@ System.out.println("sessionManagerNet()"); ServerSocketChannel ssc = ServerSocketChannel.open(); - ssc.configureBlocking(false); + ssc.configureBlocking(false); //should be true ssc.socket().bind(new InetSocketAddress(port)); ssc.register(selector, SelectionKey.OP_ACCEPT); @@ -66,17 +62,41 @@ selector.select(); for(SelectionKey key : selector.selectedKeys()){ if(key.isAcceptable()){ - SocketChannel channel = ssc.accept(); + + /*** EditorChannel を用いない記述 ***/ + SocketChannel channel = ssc.accept(); //keyからchannelを取って、accept registerChannel (selector, channel, SelectionKey.OP_READ); channel = null; + + /*** EditorChannel を用いた記述 ****/ + //EditorChannel echannel = (EditorChannel) ssc.accept(); + //echannel.setIO(); + //registerChannel(selector, echannel, SelectionKey.OP_READ); + //echannel = null; + + /*** SelectableEditorChannel ***/ + //SocketChannel channel = ssc.accept(); + //SelectableEditorChannel echannel2 = new SelectableEditorChannel(channel); + //registerChannel(selector, echannel2, SelectionKey.OP_READ); + //channel = null; + //echannel2 = null; + }else if(key.isReadable()){ + + /*** EditorChannel を用いない記述 ***/ SocketChannel channel = (SocketChannel)key.channel(); - REPPacketReceive repRec = new REPPacketReceive(channel); + REPPacketReceive repRec = new REPPacketReceive(channel); //getPacket(), putPacket() にする。 REPCommand repCom = repRec.unpack(); manager(channel, repCom); + + /*** EditorChannel を用いた記述 ****/ + //EditorChannel echannel = (EditorChannel) key.channel(); + //REPCommand command = echannel.getPacket(); + //manager(echannel, command); + }else if(key.isConnectable()){ System.out.println("Connectable"); - } + } //Socketのcloseを実装する } } } @@ -85,7 +105,7 @@ if(channel == null) { return; } - System.out.println("registerChannel()"); + //System.out.println("registerChannel()"); channel.configureBlocking(false); selector.wakeup(); channel.register(selector, ops); @@ -108,21 +128,21 @@ break; case REP.SMCMD_PUT: int sessionID = sessionlist.addSession(channel, repCmd.string); //SIDを取得 - smList.update(sessionID, repCmd.string); //updateコマンド:Session生成を通知 - sessionmanagerGUI.setComboSession(sessionID, repCmd.string); - repCmd.setSID(sessionID); //SIDをセット - repCmd.setCMD(repCmd.cmd + 1); //ACKを返す + smList.update(sessionID, repCmd.string); //updateコマンド:Session生成を通知 + sessionmanagerGUI.setComboSession(sessionID, repCmd.string); //ComboBoxにSessionを追加 + repCmd.setSID(sessionID); //SIDをセット + repCmd.setCMD(repCmd.cmd + 1); //ACKを返す REPPacketSend repSend2 = new REPPacketSend(channel); repSend2.send(repCmd); //sessionlist.sendAddedSession(repCmd); break; - case REP.SMCMD_PUT_ACK: - break; +// case REP.SMCMD_PUT_ACK: +// break; case REP.SMCMD_SELECT: sessionlist.addEditor(channel, repCmd.sid, repCmd); //sessionlistへ追加 repCmd.setCMD(repCmd.cmd + 1); REPPacketSend repSend3 = new REPPacketSend(channel); - repSend3.send(repCmd); //ACKを返す + repSend3.send(repCmd); //ACKを返す break; case REP.SMCMD_SELECT_ACK: break; @@ -140,16 +160,20 @@ smList.add(channel); //SessionManagerのリストへ追加 break; case REP.SMCMD_UPDATE: - int sessionID2 = sessionlist.addSession(channel, repCmd.string); + int sessionID2 = sessionlist.addSession(channel, repCmd.string); //Sessionを作成 + sessionlist.addEditor(channel, sessionID2, repCmd); //sessionlist.sendAddedSession(repCmd); - sessionmanagerGUI.setComboSession(sessionID2, repCmd.string); + sessionmanagerGUI.setComboSession(sessionID2, repCmd.string); //ComboBoxにSessionを追加 + break; + case REP.SMCMD_UPDATE_ACK: + // break; case REP.REPCMD_READ: sessionlist.sendCmd(channel, repCmd); break; default: - sessionlist.sendCmd(channel, repCmd, true); - //sessionlist.sendToNextEditor(channel, repCmd); + //sessionlist.sendCmd(channel, repCmd); + sessionlist.sendToNextEditor(channel, repCmd); break; } @@ -202,7 +226,6 @@ } public void ActionOccured(REPActionEvent event) { - // TODO Auto-generated method stub System.out.println("Action!"); SocketChannel editorChannel = event.getEditorChannel(); int sid = event.getSID();