package org.nutz.lang.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.net.SocketException; import org.nutz.lang.Strings; import org.nutz.lang.util.Context; import org.nutz.log.Log; import org.nutz.log.Logs; import org.nutz.trans.Atom; public class SocketAtom implements Atom { private static final Log log = Logs.get(); protected Socket socket; protected OutputStream ops; protected BufferedReader br; protected String line; protected SocketActionTable saTable; protected Context context; public SocketAtom(Context context, Socket socket, SocketActionTable saTable) { this.context = context; this.socket = socket; this.saTable = saTable; } public void run() { if (this.context.getBoolean("stop")) { if (log.isInfoEnabled()) log.info("stop=true, so, exit ...."); //线程池里面可能还有有尚未启动的任务 //所以,这里还需要判断一下 Sockets.safeClose(socket); return; } if (log.isDebugEnabled()) log.debugf("connect with '%s'", socket.getRemoteSocketAddress().toString()); try { br = new BufferedReader(new InputStreamReader(socket.getInputStream())); ops = socket.getOutputStream(); } catch (IOException e1) { return; } // 开始交互 try { doRun(); } catch (SocketException e) {} // 要关闭 socket 监听 ... catch (CloseSocketException e) { if (log.isInfoEnabled()) log.info("Catch CloseSocketException , set lock stop"); context.set("stop", true); } catch (IOException e) { log.error("Error!! ", e); } // 最后保证关闭 finally { if (log.isDebugEnabled()) log.debug("Close socket"); Sockets.safeClose(socket); } } protected void doRun() throws IOException { // 预先读取一行 line = br.readLine(); // 在这个 socket 中逐行读取 ... while (null != line) { if (log.isDebugEnabled()) log.debug(" <<socket<<: " + line); SocketAction action = saTable.get(Strings.trim(line)); if (null != action) { SocketContext context = new SocketContext(this); // action.run 抛出的异常会被原汁原味的抛到外面, // 而本函数的异常则在各个语句被处理了 ^_^ action.run(context); } // 继续读取 line = br.readLine(); } } public Socket getSocket() { return socket; } }