代码优化

This commit is contained in:
newpanjing
2017-03-15 09:56:24 +08:00
committed by panjing
parent cb45fe9548
commit 284ac1f5e9
3 changed files with 282 additions and 262 deletions
@@ -1,6 +1,5 @@
package cn.wenat; package cn.wenat;
import java.sql.Time;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@@ -23,296 +22,312 @@ import io.socket.client.Socket;
public class LocalServer { public class LocalServer {
private static final String HTTP_REQUEST = "httpRequest"; private static final String HTTP_REQUEST = "httpRequest";
private static final String HTTP_RESPONSE = "httpResponse"; private static final String HTTP_RESPONSE = "httpResponse";
private static final String BIND_DOMAIN = "bindDomain"; private static final String BIND_DOMAIN = "bindDomain";
private static final String BIND_DOMAIN_NOTICE = "bindDomainNotice"; private static final String BIND_DOMAIN_NOTICE = "bindDomainNotice";
private static final String PING = "clientPing"; private static final String PING = "clientPing";
private static final String PING_NOTICE = "clientPingNotice"; private static final String PING_NOTICE = "clientPingNotice";
private Logger logger = Logger.getLogger(getClass()); private Logger logger = Logger.getLogger(getClass());
private Socket socket; private Socket socket;
private String server; private String server;
private String forward; private String forward;
private String domain; private String domain;
private long traffic = 0;// 流量统计 private long traffic = 0;// 流量统计
private long speed = 0;// 实时网速统计 private long speed = 0;// 实时网速统计
public void setDomain(String domain) { public void setDomain(String domain) {
this.domain = domain;
}
public void setForward(String forward) { this.domain = domain;
this.forward = forward; }
}
public void setServer(String server) { public void setForward(String forward) {
this.server = server;
}
private CallListener callListener; this.forward = forward;
}
public void setCallListener(CallListener callListener) { public void setServer(String server) {
this.callListener = callListener;
}
public void ping() { this.server = server;
if (socket == null) { }
return;
}
socket.emit(PING, System.currentTimeMillis());
}
public void bindDomain() { private CallListener callListener;
socket.emit(BIND_DOMAIN, domain); public void setCallListener(CallListener callListener) {
} this.callListener = callListener;
}
public void start() throws Exception { public void ping() {
Options opts = new Options(); if (socket == null) {
opts.transports = new String[] { "websocket", "polling" }; return;
socket = IO.socket(server, opts); }
socket.emit(PING, System.currentTimeMillis());
}
Map<String, String> eventMapper = new HashMap<String, String>(); public void bindDomain() {
eventMapper.put(Socket.EVENT_DISCONNECT, "断开连接"); socket.emit(BIND_DOMAIN, domain);
eventMapper.put(Socket.EVENT_ERROR, "断开错误");
eventMapper.put(Socket.EVENT_CONNECTING, "正在连接服务器");
eventMapper.put(Socket.EVENT_CONNECT_TIMEOUT, "连接服务器超时");
eventMapper.put(Socket.EVENT_RECONNECTING, "自动重连服务器");
eventMapper.put(Socket.EVENT_RECONNECT, "准备重连服务器");
eventMapper.put(Socket.EVENT_CONNECT, "连接服务器成功");
eventMapper.put(HTTP_REQUEST, null);
eventMapper.put(BIND_DOMAIN_NOTICE, null);
eventMapper.put(PING_NOTICE, null);
Set<String> keys = eventMapper.keySet();
// 注册事件和提示信息
for (String k : keys) {
SocketListener socketListener = new SocketListener() {
@Override }
public void eventCall(String eventName, String message, Object... args) {
if (null != message) {
callListener.eventCall("[" + eventName + "]" + message);
}
switch (eventName) {
case Socket.EVENT_CONNECT:
callListener.statusCall("连接服务器成功");
LocalServer.this.bindDomain();
LocalServer.this.ping();
break;
case HTTP_REQUEST:
handlerRequest(args);
break;
case BIND_DOMAIN_NOTICE:
handlerBindDomain(args);
break;
case PING_NOTICE:
handlerPing(args);
break;
default:
break;
}
}
}; public void start() throws Exception {
socketListener.setEventName(k);
socketListener.setMessage(eventMapper.get(k));
socket.on(k, socketListener);
}
socket.connect();
// 注册回调事件,实时统计网络速率 Options opts = new Options();
opts.transports = new String[]{"websocket", "polling"};
socket = IO.socket(server, opts);
TimerTask task = new TimerTask() { Map<String, String> eventMapper = new HashMap<String, String>();
@Override eventMapper.put(Socket.EVENT_DISCONNECT, "断开连接");
public void run() { eventMapper.put(Socket.EVENT_ERROR, "断开错误");
long temp = speed; eventMapper.put(Socket.EVENT_CONNECTING, "正在连接服务器");
speed = 0; eventMapper.put(Socket.EVENT_CONNECT_TIMEOUT, "连接服务器超时");
callListener.speedCall(temp); eventMapper.put(Socket.EVENT_RECONNECTING, "自动重连服务器");
eventMapper.put(Socket.EVENT_RECONNECT, "准备重连服务器");
eventMapper.put(Socket.EVENT_CONNECT, "连接服务器成功");
eventMapper.put(HTTP_REQUEST, null);
eventMapper.put(BIND_DOMAIN_NOTICE, null);
eventMapper.put(PING_NOTICE, null);
Set<String> keys = eventMapper.keySet();
// 注册事件和提示信息
for (String k : keys) {
SocketListener socketListener = new SocketListener() {
} @Override
}; public void eventCall(String eventName, String message, Object... args) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(task, 0, 1000);
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override if (null != message) {
public void run() { callListener.eventCall("[" + eventName + "]" + message);
ping(); }
} switch (eventName) {
}, 0, 10000); case Socket.EVENT_CONNECT:
} callListener.statusCall("连接服务器成功");
LocalServer.this.bindDomain();
LocalServer.this.ping();
break;
case HTTP_REQUEST:
handlerRequest(args);
break;
case BIND_DOMAIN_NOTICE:
handlerBindDomain(args);
break;
case PING_NOTICE:
handlerPing(args);
break;
default:
break;
}
}
private void handlerPing(Object[] args) { };
long time = (long) args[0]; socketListener.setEventName(k);
long ms = System.currentTimeMillis() - time; socketListener.setMessage(eventMapper.get(k));
callListener.ping(ms); socket.on(k, socketListener);
} }
socket.connect();
private void handlerBindDomain(Object... args) { // 注册回调事件,实时统计网络速率
try {
org.json.JSONObject jsonObject = (org.json.JSONObject) args[0];
int code = jsonObject.getInt("code");
String msg = jsonObject.getString("msg");
if (code == 1000) {
// 弹出地址
} else {
// 断开链接
socket.close();
callListener.onClose();
}
callListener.eventCall("[绑定域名]:" + msg);
} catch (Exception e) {
logger.error(e);
}
}
/** TimerTask task = new TimerTask() {
* 处理远程的http请求
*
* @param args
*/
private void handlerRequest(Object... args) {
org.json.JSONObject object = (org.json.JSONObject) args[0];
JSONObject request = JSON.parseObject(object.toString());
String url = request.getString("url");
Map<String, Object> headers = request.getJSONObject("headers");
headers.remove("content-length");
String method = request.getString("method");
String eventName = request.getString("eventName");
Map<String, Object> params = request.getJSONObject("params"); @Override
public void run() {
String reqUrl = forward + url; long temp = speed;
logger.info("收到请求: methon=" + method + " url=" + reqUrl); speed = 0;
if (callListener != null) { callListener.speedCall(temp);
callListener.eventCall("[远程请求]: methon=" + method + " url=" + reqUrl + " params:" + params + " headers:" + headers);
}
Response response = null;
// 发送请求
// 替换host
Set<String> keys = headers.keySet();
if ("POST".equals(method.toUpperCase())) {
// 查看是否是json或者xml请求一类 }
String encoding = "utf-8"; };
String contentType = null; Timer timer = new Timer();
if (headers.get("content-type") != null) { timer.scheduleAtFixedRate(task, 0, 1000);
contentType = headers.get("content-type").toString(); new Timer().scheduleAtFixedRate(new TimerTask() {
String[] array = contentType.split(";");
contentType = array[0];
if (array.length > 1) {
String[] charsets = array[1].split("=");
if (charsets.length > 1) {
encoding = charsets[1];
}
}
}
HttpPost post = new HttpPost(reqUrl);
for (String k : keys) {
post.addHeader(k, String.valueOf(headers.get(k)));
}
try { @Override
// 默认类型application/x-www-form-urlencoded public void run() {
if (contentType == null) {
contentType = "application/x-www-form-urlencoded";
}
// 兼容普通post和json/xml post ping();
if (contentType.equals("application/x-www-form-urlencoded")) { }
response = HttpClientUtils.post(post, params); }, 0, 10000);
}else { }
//其他的全部postBody
response = HttpClientUtils.postBody(post, request.getString("body"), encoding);
}
} catch (Exception e) {
response = new Response();
response.setStatusCode(500);
response.setStatusMessage("本地服务器报错:" + e.getMessage());
}
} else if ("GET".equals(method.toUpperCase())) { private void handlerPing(Object[] args) {
HttpGet get = new HttpGet(reqUrl);
for (String k : keys) {
get.addHeader(k, String.valueOf(headers.get(k)));
}
try {
response = HttpClientUtils.get(get);
} catch (Exception e) {
response = new Response();
response.setStatusCode(500);
response.setStatusMessage("本地服务器报错:" + e.getMessage());
}
} else {
// 提示请求不支持
response = new Response();
response.setStatusCode(500);
response.setEncoding("utf-8");
response.setStatusMessage(method + "请求类型暂时不支持!");
}
org.json.JSONObject jsonObject = new org.json.JSONObject();
try {
// 处理重定向 long time = (long) args[0];
if (response.getStatusCode() == 302 || response.getStatusCode() == 307 || response.getStatusCode() == 303) { long ms = System.currentTimeMillis() - time;
// 处理地址 callListener.ping(ms);
String localtion = response.getHeaders().get("Location"); }
localtion.replace(server, domain);
response.getHeaders().put("Location", localtion);
}
byte[] bytes = (byte[]) response.getBody(); private void handlerBindDomain(Object... args) {
long length = bytes.length;
this.traffic += length;
this.speed += length;
jsonObject.put("body", response.getBody());
jsonObject.put("headers", response.getHeaders());
jsonObject.put("statusCode", response.getStatusCode());
jsonObject.put("encoding", response.getEncoding());
jsonObject.put("statusMessage", response.getStatusMessage());
jsonObject.put("eventName", eventName);
} catch (JSONException e) {
e.printStackTrace();
}
logger.info("请求响应:" + response);
if (callListener != null) {
callListener.eventCall("[目标响应]:" + response);
}
if (socket == null) {
callListener.eventCall("[服务关闭] The service has been closed.");
return;
}
socket.emit(HTTP_RESPONSE, jsonObject);
// 通知界面显示流量
callListener.trafficCall(this.traffic);
}
public void stop() { try {
if (socket != null) { org.json.JSONObject jsonObject = (org.json.JSONObject) args[0];
socket.close(); int code = jsonObject.getInt("code");
socket = null; String msg = jsonObject.getString("msg");
} if (code == 1000) {
callListener.ping(0l); // 弹出地址
} } else {
// 断开链接
socket.close();
callListener.onClose();
}
callListener.eventCall("[绑定域名]:" + msg);
} catch (Exception e) {
logger.error(e);
}
}
public static void main(String[] args) throws Exception { /**
new MainForm().setVisible(true); * 处理远程的http请求
*
* @param args
*/
private void handlerRequest(Object... args) {
} org.json.JSONObject object = (org.json.JSONObject) args[0];
JSONObject request = JSON.parseObject(object.toString());
String url = request.getString("url");
Map<String, Object> headers = request.getJSONObject("headers");
headers.remove("content-length");
String method = request.getString("method");
String eventName = request.getString("eventName");
Map<String, Object> params = request.getJSONObject("params");
String reqUrl = forward + url;
logger.info("收到请求: methon=" + method + " url=" + reqUrl);
if (callListener != null) {
callListener.eventCall("[远程请求]: methon=" + method + " url=" + reqUrl + " params:" + params + " headers:" + headers);
}
Response response = null;
// 发送请求
// 替换host
Set<String> keys = headers.keySet();
if ("POST".equals(method.toUpperCase())) {
// 查看是否是json或者xml请求一类
String encoding = "utf-8";
String contentType = null;
if (headers.get("content-type") != null) {
contentType = headers.get("content-type").toString();
String[] array = contentType.split(";");
contentType = array[0];
if (array.length > 1) {
String[] charsets = array[1].split("=");
if (charsets.length > 1) {
encoding = charsets[1];
}
}
}
HttpPost post = new HttpPost(reqUrl);
for (String k : keys) {
post.addHeader(k, String.valueOf(headers.get(k)));
}
try {
// 默认类型application/x-www-form-urlencoded
if (contentType == null) {
contentType = "application/x-www-form-urlencoded";
}
// 兼容普通post和json/xml post
if (contentType.equals("application/x-www-form-urlencoded")) {
response = HttpClientUtils.post(post, request.getJSONObject("body"));
} else {
//其他的全部postBody
response = HttpClientUtils.postBody(post, request.getString("body"), encoding);
}
} catch (Exception e) {
response = new Response();
response.setStatusCode(500);
response.setStatusMessage("本地服务器报错:" + e.getMessage());
}
} else if ("GET".equals(method.toUpperCase())) {
HttpGet get = new HttpGet(reqUrl);
for (String k : keys) {
get.addHeader(k, String.valueOf(headers.get(k)));
}
try {
response = HttpClientUtils.get(get);
} catch (Exception e) {
response = new Response();
response.setStatusCode(500);
response.setStatusMessage("本地服务器报错:" + e.getMessage());
}
} else {
// 提示请求不支持
response = new Response();
response.setStatusCode(500);
response.setEncoding("utf-8");
response.setStatusMessage(method + "请求类型暂时不支持!");
}
org.json.JSONObject jsonObject = new org.json.JSONObject();
try {
// 处理重定向
if (response.getStatusCode() == 302 || response.getStatusCode() == 307 || response.getStatusCode() == 303) {
// 处理地址
String localtion = response.getHeaders().get("Location");
localtion.replace(server, domain);
response.getHeaders().put("Location", localtion);
}
byte[] bytes = (byte[]) response.getBody();
if (bytes == null) {
bytes = new byte[]{};
}
long length = bytes.length;
this.traffic += length;
this.speed += length;
jsonObject.put("body", response.getBody());
jsonObject.put("headers", response.getHeaders());
jsonObject.put("statusCode", response.getStatusCode());
jsonObject.put("encoding", response.getEncoding());
jsonObject.put("statusMessage", response.getStatusMessage());
jsonObject.put("eventName", eventName);
} catch (JSONException e) {
e.printStackTrace();
}
logger.info("请求响应:" + response);
if (callListener != null) {
callListener.eventCall("[目标响应]:" + response);
}
if (socket == null) {
callListener.eventCall("[服务关闭] The service has been closed.");
return;
}
socket.emit(HTTP_RESPONSE, jsonObject);
// 通知界面显示流量
callListener.trafficCall(this.traffic);
}
public void stop() {
if (socket != null) {
socket.close();
socket = null;
}
callListener.ping(0l);
}
public static void main(String[] args) throws Exception {
new MainForm().setVisible(true);
}
} }
@@ -7,23 +7,28 @@ import java.awt.event.WindowEvent;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JFrame; import javax.swing.JFrame;
/**
* 父类
*/
public class BaseForm extends JFrame { public class BaseForm extends JFrame {
private static final long serialVersionUID = -8446051052250946428L; private static final long serialVersionUID = -8446051052250946428L;
public BaseForm() { public BaseForm() {
getContentPane().setLayout(null);
getContentPane().setBackground(new Color(248, 251, 253));
this.addWindowListener(new WindowAdapter() {
@Override getContentPane().setLayout(null);
public void windowClosing(WindowEvent e) { getContentPane().setBackground(new Color(248, 251, 253));
System.exit(0); this.addWindowListener(new WindowAdapter() {
super.windowClosing(e);
}
});
ImageIcon imageIcon = new ImageIcon(getClass().getResource("/logo.png"));
this.setIconImage(imageIcon.getImage()); @Override
} public void windowClosing(WindowEvent e) {
System.exit(0);
super.windowClosing(e);
}
});
ImageIcon imageIcon = new ImageIcon(getClass().getResource("/logo.png"));
this.setIconImage(imageIcon.getImage());
}
} }
@@ -191,7 +191,7 @@ public class HttpClientUtils {
} }
HttpEntity httpEntity = new UrlEncodedFormEntity(basicNameValuePairs, DEFAULT_ENCODING); HttpEntity httpEntity = new UrlEncodedFormEntity(basicNameValuePairs, DEFAULT_ENCODING);
httpPost.setEntity(httpEntity); httpPost.setEntity(httpEntity);
} }
CloseableHttpResponse response = getClient().execute(httpPost); CloseableHttpResponse response = getClient().execute(httpPost);