private boolean stranger(String myName) { // tty.println("=+= " + (myName.getBytes()[0])+" =" ); // tty.println("=+= " + Character.isISOControl(myName.charAt(0))); if (Character.isISOControl(myName.charAt(0))) myName = "QUIT"; if (myName.equals("QUIT")) { writeLine("! Thank you for coming!"); } if (myName == null || myName.equals("QUIT")) { tty.println(" --- from " + remoteAddr + " at " + now.toString()); return true; } // "QUIT" is not allowed as a nick name if (myName.equals(SECRET_NAME)) { tty.println("GiGi from " + remoteAddr + " at " + now.toString()); doList(); return true; } return false; // a usual user name }
public void run() { now = new Date(); try { remoteAddr = mySock.getInetAddress().getHostAddress(); // 然後取得InputStream並包成 BufferedReader 方便 readLine() in = new BufferedReader(new InputStreamReader(mySock.getInputStream())); // 再取得 OutputStream 並包成 PrintWriter out = new PrintWriter(new OutputStreamWriter(mySock.getOutputStream()), true); // 接著, 要求連線者輸入 nickname myName = askNickname(); // 若輸入怪異的nickname例如Control_C 則終止連線 if (stranger(myName)) { close(); return; } // 廣播給所有聊天室的人 doBcast("CHAT *** " + myName + " is coming in ***"); // 並在 console 上顯示 (tty == System.out) tty.println(myName + "@" + remoteAddr + " enters the Chat Room " + now.toString()); // writeLine(msg) 會把 msg 寫到目前連線者終端機 writeLine("CHAT *** Welcome 歡迎 " + myName + " 進入聊天室 ***"); writeLine("You can type '/help' for help"); String cmd, msg; int mode; FOO: while ((cmd = in.readLine()) != null) { StringTokenizer stkn = new StringTokenizer(cmd, " \t"); String command = " "; if (stkn.countTokens() >= 1) command = stkn.nextToken(); msg = " "; if (stkn.hasMoreTokens()) msg = stkn.nextToken("\n"); mode = parseCommand(command.toUpperCase()); switch (mode) { case CMD_MSG: doMsg(msg); break; case CMD_LIST: doList(); break; case CMD_QUERY: doQuery(cmd.substring(6)); break; case CMD_NICK: doNick(msg); break; case CMD_HELP: doHelp(); break; case CMD_QUIT: now = new Date(); tty.println(myName + " said BYE at " + now.toString()); doBcast("[" + myName + " saied Bye Bye! ]"); break FOO; case CMD_DATA: doBcast("[" + myName + "] " + cmd); tty.println(myName + ": " + cmd); break; } // switch } // while FOO: } catch (Exception e) { tty.println(e.toString()); } now = new Date(); tty.println(now.toString() + " one thread stop"); close(); }