package com.smtscript.debug; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Method; import java.net.Socket; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; import com.smtscript.utils.Json; public abstract class ScriptDebugSocketAbstract { protected Socket _socket; protected Object _lockSocket = new Object(); protected Charset _charset = Charset.forName("UTF-8"); protected Map _mapName2RespMethod = new HashMap(); public ScriptDebugSocketAbstract(Socket socket) throws Exception { _socket = socket; } /** * 启动接收事件的线程 */ protected void startReceive() { new Thread(new Runnable(){ @Override public void run() { ScriptDebugSocketAbstract.this.run(); } }).start(); } /** * 发送通知消息到对方, 如果通知的json中包含id,response对象将被保存 * * @param jsonSend - 通知json * @param response - 需要保存的response对象 */ public void sendSockRequest(Json jsonSend) throws Exception { synchronized(_lockSocket) { _socket.getOutputStream().write((jsonSend.toString() + "\n").getBytes(_charset)); } } /** * 接收线程的运行函数 * @throws IOException */ private void run() { Exception exRun = null; try { BufferedReader rd = new BufferedReader(new InputStreamReader(_socket.getInputStream(), _charset)); String line; while((line = rd.readLine()) != null) { Json jsonRecv = Json.read(line); String eventName = jsonRecv.getJson("event").asString().toUpperCase(); onReceive(eventName, jsonRecv); } } catch(Exception ex) { exRun = ex; } finally { try { _socket.close(); onClose(exRun); } catch (Exception e) { } _socket = null; } } /** * 根据事件函数映射表,将事件分配到函数上 * * @param mapName2Method - 事件函数映射表 * @param eventName - 事件名称 * @param jsonRecv - 收到的json数据 * @param response - 本地保存的应答数据 * @return - true : 本地已经处理, false:本地未处理 */ protected boolean dispatchReceive(Map mapName2Method, String eventName, Json jsonRecv) throws Exception { Method method = mapName2Method.get(eventName); if(method == null) return false; method.invoke(this, eventName, jsonRecv); return true; } protected void onClose(Exception ex) throws Exception { } protected abstract void onReceive(String eventName, Json jsonRecv) throws Exception; }