1 55 package org.lateralnz.common.telnet; 56 57 import java.io.*; 58 import java.lang.reflect.Constructor ; 59 import java.net.ServerSocket ; 60 import java.net.Socket ; 61 62 import org.lateralnz.common.util.IOUtils; 63 import org.lateralnz.common.util.StringUtils; 64 65 public class Server extends Thread implements Constants { 66 67 private static final String [] NAMES = new String [256]; 68 private static final String UNKNOWN = "[UNK]"; 69 70 static { 71 for (int i = 0; i < NAMES.length; i++) { 72 NAMES[i] = UNKNOWN; 73 } 74 NAMES[0] = "NULL"; 75 NAMES[1] = "echo"; 76 NAMES[3] = "suppress go ahead"; 77 NAMES[5] = "status"; 78 NAMES[6] = "timing mark"; 79 NAMES[8] = "backspace"; 80 NAMES[24] = "terminal type"; 81 NAMES[31] = "window size"; 82 NAMES[32] = "terminal speed"; 83 NAMES[33] = "remote flow control"; 84 NAMES[34] = "linemode"; 85 NAMES[36] = "environment variables"; 86 87 NAMES[240] = "SE"; 88 NAMES[241] = "NOP"; 89 NAMES[242] = "DM"; 90 NAMES[243] = "BRK"; 91 NAMES[244] = "IP"; 92 NAMES[245] = "AO"; 93 NAMES[246] = "AYT"; 94 NAMES[247] = "EC"; 95 NAMES[248] = "EL"; 96 NAMES[249] = "GA"; 97 NAMES[250] = "SB"; 98 NAMES[251] = "WILL"; 99 NAMES[252] = "WONT"; 100 NAMES[253] = "DO"; 101 NAMES[254] = "DONT"; 102 NAMES[255] = "IAC"; 103 } 104 105 private static final String QUIT = "quit"; 106 107 108 private boolean running = true; 109 private int port; 110 private Class baseHandlerClass; 111 private String allowFromRegex; 112 113 public Server(int port, Class baseHandlerClass, String allowFromRegex) throws IOException { 114 super(); 115 116 this.port = port; 117 this.baseHandlerClass = baseHandlerClass; 118 119 if (StringUtils.isEmpty(allowFromRegex)) { 120 this.allowFromRegex = ".*"; 121 } 122 else { 123 this.allowFromRegex = allowFromRegex; 124 } 125 126 127 128 start(); 129 } 130 131 public static final String getCommand(int b) { 132 if (b < 0 || b > NAMES.length) { 133 return UNKNOWN; 134 } 135 else { 136 return NAMES[b]; 137 } 138 } 139 140 public static final String getCommandString(int b1, int b2, int b3) { 141 return getCommand(b1) + " " + getCommand(b2) + " " + getCommand(b3); 142 } 143 144 public void run() { 145 ServerSocket ss = null; 146 Socket socket; 147 try { 148 ss = new ServerSocket (port); 149 Constructor cons = baseHandlerClass.getConstructor(new Class []{ Server.class, Socket .class }); 150 151 while (running) { 152 socket = ss.accept(); 153 if (!StringUtils.matches(socket.getInetAddress().getHostAddress(), allowFromRegex)) { 154 System.err.println("invalid access from " + socket.getInetAddress()); 155 socket.close(); 156 continue; 157 } 158 BaseHandler bh = (BaseHandler)cons.newInstance(new Object []{ this, socket }); 159 160 this.yield(); 161 } 162 } 163 catch (Exception e) { 164 e.printStackTrace(); 165 } 166 finally { 167 IOUtils.close(ss); 168 } 169 } 170 171 public void shutdown() { 172 running = false; 173 try { interrupt(); } catch (Exception e) { } 174 } 175 176 public static final void main(String [] args) throws Exception { 177 Server s = new Server(1111, BaseHandler.class, ""); 178 } 179 180 } | Popular Tags |