Mercurial > hg > RemoteEditor > REPSessionManager
view rep/REPPacketReceive.java @ 84:54334d83194a
*** empty log message ***
author | pin |
---|---|
date | Fri, 21 Dec 2007 16:03:04 +0900 |
parents | e9fba549803e |
children | 628e7ffeb097 |
line wrap: on
line source
package rep; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.SocketChannel; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.util.LinkedList; import java.util.StringTokenizer; public class REPPacketReceive { SocketChannel socketchannel; private final int HEADER_SIZE = 24; private final int CHAR_ORDER = 3; //private String host; //private int port; SelectionKey key; public REPPacketReceive(SocketChannel sc){ socketchannel = sc; } public void setkey(SelectionKey key) { this.key = key; //key.cancel(); } public REPCommand unpack() { ByteBuffer header = ByteBuffer.allocateDirect(HEADER_SIZE); long len = 0; header.clear(); try { len = socketchannel.read(header); if(len == -1){ if(key != null){ key.cancel(); } socketchannel.close(); return null; }else if(len == 0){ return null; } } catch (IOException e1) { e1.printStackTrace(); } // limit = read length if (len !=HEADER_SIZE) { System.out.println("てす"); // this can't happen } header.rewind(); // position = 0 String text = ""; int cmd = header.getInt(); int sid = header.getInt(); int eid = header.getInt(); int seqid = header.getInt(); int lineno = header.getInt(); int textsiz = header.getInt()/2; ByteBuffer textBuffer = ByteBuffer.allocateDirect(textsiz*2); try { len = socketchannel.read(textBuffer); } catch (IOException e1) { e1.printStackTrace(); } // limit = read length if (len != textsiz * 2) { // this can't happen System.out.println("あと"); } textBuffer.rewind(); for(int i=0;i<textsiz;i++) { text +=textBuffer.getChar(); } String string = text; //System.out.println(string); //getSocket(string); REPCommand repcommand = new REPCommand(cmd, sid, eid, seqid, lineno, textsiz, string); System.out.println("received command: " + repcommand.toString()); //getSocket(repcommand); //System.out.println("received command: " + repcommand.toString()); return repcommand; } public REPCommand unpackUConv() { ByteBuffer header = ByteBuffer.allocateDirect(HEADER_SIZE); long len = 0; header.clear(); try { len = socketchannel.read(header); if(len == -1){ if(key != null){ key.cancel(); } socketchannel.close(); return null; }else if(len == 0){ return null; } } catch (IOException e1) { e1.printStackTrace(); } // limit = read length if (len !=HEADER_SIZE) { System.out.println("てす"); // this can't happen } header.rewind(); // position = 0 int cmd = header.getInt(); int sid = header.getInt(); int eid = header.getInt(); int seqid = header.getInt(); int lineno = header.getInt(); int textsiz = header.getInt(); //int tmptextsiz = header.getInt(); //int textsiz = (tmptextsiz /5) + (tmptextsiz % 5); ByteBuffer textBuffer = ByteBuffer.allocateDirect(textsiz); try { len = socketchannel.read(textBuffer); if(len == -1){ if(key != null){ key.cancel(); } socketchannel.close(); return null; }else if(len == 0){ return null; } } catch (IOException e1) { e1.printStackTrace(); } // limit = read length if (len != textsiz) { // this can't happen System.out.println("あと"); } textBuffer.rewind(); //Decode UTF-8 to System Encoding(UTF-16) Charset charset = Charset.forName("UTF-8"); CharsetDecoder decoder = charset.newDecoder(); CharBuffer cb = null; try { cb = decoder.decode(textBuffer); } catch (CharacterCodingException e) { e.printStackTrace(); } cb.rewind(); String string = cb.toString(); textsiz = string.length(); //System.out.println("CharBuffer size: " +cb.length()); //System.out.println("textsize: " +textsiz); //System.out.println(cb.toString()); REPCommand repcommand = new REPCommand(cmd, sid, eid, seqid, lineno, textsiz, string); System.out.println("UnPack Packet: => cmd:"+cmd+" sid:"+sid+" eid:"+eid+"seqid:"+seqid+" lineno:"+lineno+" textsiz:" +textsiz+" text: "+string); System.out.println("received command: " + repcommand.toString()); return repcommand; } private void getSocket(REPCommand command) { if(command.cmd != REP.SMCMD_JOIN){ String string = command.string; StringTokenizer st2 = new StringTokenizer(string, ":"); LinkedList<String> list = new LinkedList<String>(); while (st2.hasMoreTokens()){ list.add(st2.nextToken()); } String port = list.getLast(); list.removeLast(); String host = list.getLast(); int socketInfoLength = host.length() + port.length() + 2; System.out.println(host.length() + ":" + port.length() + ":" + socketInfoLength); command.setString(string.substring(0, string.length() - socketInfoLength)); command.setHost(host); command.setPort(port); } } }