Socket

来源:互联网 发布:两种方法创建数据库 编辑:程序博客网 时间:2024/05/19 03:30

public class MonitorAdminServer extends Thread {
private final LoggerManager logger = new LoggerManager(MonitorServer.class);


public void run() {
while (true)
try {
ServerSocket server = new ServerSocket(WebConstants.MONITOR_PORT);
try {
while (true) {
Socket clientSocket = server.accept();
if (clientSocket != null) {
if (JnaService.checkIpLimit(WebConstants.IPLIMIT_NAME, clientSocket.getInetAddress().getHostAddress())) {
clientSocket.setKeepAlive(true);
clientSocket.setSoTimeout(20000); // 设置超时读不到请求就退出,否则会被监控脚本挂住占着线程
WorkThread swt = new WorkThread(clientSocket);
swt.start();
clientSocket = null;
} else {
OutputStream os = clientSocket.getOutputStream();
os.write(("-ERROR the client ip " + clientSocket.getInetAddress().getHostAddress() + " isn't allow\r\n\r\n").getBytes());
os.flush();
clientSocket.close();
}
}
}
} catch (Exception e) {
logger.error("MonitorServer.init error,e=" + e);
} finally {
if (server != null) {
server.close();
}
}
} catch (Exception e) {
logger.error("MonitorServer.init error,e=" + e);
// 如果端口被绑定了,则等待60秒后重试,直到成功。
if (e instanceof java.net.BindException) {
try {
Thread.sleep(60000L);
} catch (Exception e1) {
}
}
}
}

}


import com.sun.mail.util.LineInputStream;


public class WorkThread extends Thread {
Socket clientSocket;
LoggerManager logger = new LoggerManager(getClass());


public WorkThread(Socket clientSocket) {
this.clientSocket = clientSocket;
}


public void run() {
LineInputStream lis = null;
OutputStream os = null;
try {
os = clientSocket.getOutputStream();
lis = new LineInputStream(clientSocket.getInputStream());
os.write("+OK welcome to webapp service\r\n\r\n".getBytes());
os.flush();
int time = 20000;
int occupy = 0;
while (occupy <= time) {
String req = lis.readLine();
// 这个null就是socket关掉了。要马上返回啊。不然就要出事了
if (req == null || "".equals(req)) {
break;
}
logger.info("MonitorCMD=" + req);
if (req.startsWith("modifyMe")) {
String[] split = req.split(" ");
if (split.length == 3) {
if (split[1].equals("allowIP")) {
boolean ai = Boolean.parseBoolean(split[2]);
ServletCommon.idiotNoCheckAllowsIP = ai;
os.write((req + "| result=" + ai).getBytes());
} else if (split[1].equals("noCookiesDown")) {
boolean ai = Boolean.parseBoolean(split[2]);
ServletCommon.idiotNoCookieDownload = ai;
os.write((req + "| result=" + ai).getBytes());
} else if (split[1].equals("moveHOMailSize")) {
int size = Tools.parseIntEx(split[2]);
MoveHOMailOperation operation = (MoveHOMailOperation) OperationAgent.getOperation(WebConstants.O_FILTER_HISTORYMAIL2);
operation.updateSize(size);
os.write((req + "| result=" + size).getBytes());
} else if (split[1].equals("moveHOMailResetSendId")) {
MoveHOMailOperation operation = (MoveHOMailOperation) OperationAgent.getOperation(WebConstants.O_FILTER_HISTORYMAIL2);
operation.setNeedResetSendId(Boolean.parseBoolean(split[2]));
os.write((req + "| result=" + operation.isNeedResetSendId()).getBytes());
} else if (split[1].equals("moveHOMailResetBill")) {
MoveHOMailOperation operation = (MoveHOMailOperation) OperationAgent.getOperation(WebConstants.O_FILTER_HISTORYMAIL2);
operation.setNeedResetBill(Boolean.parseBoolean(split[2]));
os.write((req + "| result=" + operation.isNeedResetSendId()).getBytes());
} else if (split[1].equals("searchMessagesResetDate")) {
SearchMessagesOperation operation = (SearchMessagesOperation) OperationAgent.getOperation(WebConstants.O_SEARCHMESSAGES);
operation.setNeedResetDate(Boolean.parseBoolean(split[2]));
os.write((req + "| result=" + operation.isNeedResetDate()).getBytes());
} else if (split[1].equals("MiSearchNew")) {
Constants.B_MI_SEARCH_NEW = Boolean.parseBoolean(split[2]);
os.write((req + "| result=" + Constants.B_MI_SEARCH_NEW).getBytes());
} else {
os.write(("-ERROR \"" + req + "\" is not supported\r\n\r\n").getBytes());
os.flush();
break;
}
} else {
os.write(("-ERROR \"" + req + "\" is not supported\r\n\r\n").getBytes());
os.flush();
break;
}
os.write("\r\n".getBytes());
os.flush();
} else if ("version".equals(req)) {
os.write(WebConstants.X_MAILER.getBytes());
os.write("\r\n".getBytes());
os.flush();
} else if ("quit".equals(req) || "exit".equals(req) || "bye".equals(req)) {
os.write("+OK bye bye\r\n\r\n".getBytes());
os.flush();
clientSocket.close();
break;
} else if ("help".equals(req)) {
os.write(("state 查看状态\r\n\r\n").getBytes());
os.write(("reload 重新加载\r\n\r\n").getBytes());
os.flush();
} else if ("state".equals(req)) {
os.write(("+OK state\r\n" + SocketPool.poolInfo() + "\r\n\r\n").getBytes());
os.flush();
} else if (req.startsWith("forbit") || req.startsWith("regain")) {
// forbit MSID 53 表示禁止节点为53的MSID服务器
if (req.split(" ").length > 1) {
String[] split = req.split(" ");
int nodeId = Tools.parseIntEx(split[2]);
String transIds = MailConst.getTransIDStr();
boolean forbit = false; // 是否禁用或者启用
if (req.startsWith("forbit")) {
forbit = true;
} else {
forbit = false;
}


forbit = SocketPool.forbit(transIds, split[1], nodeId, forbit);
if (forbit) {
os.write("OK\r\n\r\n".getBytes());
os.flush();
} else {
os.write("ERROR: The server maybe not exists!\r\n\r\n".getBytes());
os.flush();
}
}
} else if (req.startsWith("logtype")) {
if (req.split(" ").length == 2) {
String loglever = req.split(" ")[1];
String[] levers = loglever.split(",");
boolean isOk = false;
if (levers.length > 1) {
loglever = "error";
for (int i = 0; i < levers.length; i++) {
loglever = getLowType(loglever, levers[i]);
}
}
if ("debug".equalsIgnoreCase(loglever)) {
Logger.getRootLogger().setLevel(Level.DEBUG);
isOk = true;
} else if ("info".equalsIgnoreCase(loglever)) {
Logger.getRootLogger().setLevel(Level.INFO);
isOk = true;
} else if ("warn".equalsIgnoreCase(loglever)) {
Logger.getRootLogger().setLevel(Level.WARN);
isOk = true;
} else if ("error".equalsIgnoreCase(loglever)) {
Logger.getRootLogger().setLevel(Level.ERROR);
isOk = true;
}
if (isOk) {
os.write(("+OK logtype=" + loglever + "\r\n\r\n").getBytes());
} else {
os.write(("-ERROR logtype \"" + loglever + "\" is not supported\r\n\r\n").getBytes());
}
} else {
os.write(("+OK logtype=" + Logger.getRootLogger().getLevel().toString().toLowerCase() + "\r\n\r\n").getBytes());
}
os.flush();
} else if ("reload".equals(req)) {
InitServlet.reload();
os.write("+OK reload ok\r\n\r\n".getBytes());
os.flush();
} else if (req.startsWith("m_p")) {
if (req.split(" ").length > 1) {
String q = req.split(" ")[1];
if (q.split("=").length > 1) {
String name = q.split("=")[0];
String value = q.split("=")[1];
if ("cid".equalsIgnoreCase(name)) {
int appid = Integer.parseInt(value, 16) - 11000;
ServerBean server = WebConstants.appidMap.get(appid);
os.write(("type=" + "APPID").getBytes());
os.write(("|id=" + appid).getBytes());
if (server != null) {
os.write(("|ip=" + server.getIp()).getBytes());
os.write(("|port=" + server.getPort()).getBytes());
} else {
os.write((" server not exist").getBytes());
}
} else if ("miid".equalsIgnoreCase(name)) {
int nodeId = MailConst.getNodeId(Constants.SERVER_TYPE_MI, Integer.parseInt(value));
ServerBean server = Constants.getServer(Constants.SERVER_TYPE_MI, nodeId);
os.write(("type=" + Constants.SERVER_TYPE_MI).getBytes());
os.write(("|id=" + nodeId).getBytes());
if (server != null) {
os.write(("|ip=" + server.getIp()).getBytes());
os.write(("|port=" + server.getPort()).getBytes());
} else {
os.write((" server is not exist").getBytes());
}
} else if ("msid".equalsIgnoreCase(name)) {
int nodeId = MailConst.getNodeId(Constants.SERVER_TYPE_MS, Integer.parseInt(value));
ServerBean server = Constants.getServer(Constants.SERVER_TYPE_MS, nodeId);
os.write(("type=" + Constants.SERVER_TYPE_MS).getBytes());
os.write(("|id=" + nodeId).getBytes());
if (server != null) {
os.write(("|ip=" + server.getIp()).getBytes());
os.write(("|port=" + server.getPort()).getBytes());
} else {
os.write((" server is not exist").getBytes());
}
} else if ("spid".equalsIgnoreCase(name)) {
int nodeId = MailConst.getNodeId(Constants.SERVER_TYPE_SP, Integer.parseInt(value));
ServerBean server = Constants.getServer(Constants.SERVER_TYPE_SP, nodeId);
os.write(("type=" + Constants.SERVER_TYPE_SP).getBytes());
os.write(("|id=" + nodeId).getBytes());
if (server != null) {
os.write(("|ip=" + server.getIp()).getBytes());
os.write(("|port=" + server.getPort()).getBytes());
} else {
os.write((" server not exist").getBytes());
}
} else if ("mdid".equalsIgnoreCase(name)) {
int nodeId = MailConst.getNodeId(Constants.SERVER_TYPE_MD, Integer.parseInt(value));
ServerBean server = Constants.getServer(Constants.SERVER_TYPE_MD, nodeId);
os.write(("type=" + Constants.SERVER_TYPE_MD).getBytes());
os.write(("|id=" + nodeId).getBytes());
if (server != null) {
os.write(("|ip=" + server.getIp()).getBytes());
os.write(("|port=" + server.getPort()).getBytes());
} else {
os.write((" server not exist").getBytes());
}
}
}
}
os.write("\r\n\r\n".getBytes());
os.flush();
} else {// 错误的马上关掉
os.write(("-ERROR \"" + req + "\" is not supported\r\n\r\n").getBytes());
os.flush();
break;
}


occupy += 200;
Thread.sleep(200);
}
} catch (Exception e) {
} finally {
if (os != null) {
try {
os.close();
} catch (Exception e) {
}
}
if (lis != null) {
try {
lis.close();
} catch (Exception e) {
}
}
if (clientSocket != null) {
try {
clientSocket.close();
} catch (Exception e) {
}
}
clientSocket = null;
os = null;
lis = null;
}
}


private String getLowType(String type1, String type2) {
return getTypeInt(type1) < getTypeInt(type2) ? type1 : type2;
}


private int getTypeInt(String type) {
int result = 0;
if ("debug".equalsIgnoreCase(type)) {
result = 1;
} else if ("info".equalsIgnoreCase(type)) {
result = 2;
} else if ("warn".equalsIgnoreCase(type)) {
result = 3;
} else if ("error".equalsIgnoreCase(type)) {
result = 4;
}
return result;
}
}

0 0
原创粉丝点击