自定义serverSocket线程池,处理并发链接
2018年06月11日 16:59:02 samHuangLiang 阅读数:271
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/samHuangLiang/article/details/80654484
-
public class AppServerSocket {
-
private Integer port;
-
private static ServerSocket serverSocket;
-
public AppServerSocket(Integer port) {
-
this.port = port;
-
try {
-
start();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
/**
-
* 接受连接
-
*/
-
public void start() throws IOException {
-
serverSocket = new ServerSocket(port);
-
new Thread(new Runnable() {
-
@Override
-
public void run() {
-
while (true) {
-
try {
-
Socket socket = serverSocket.accept();
-
handleSocket(socket);
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
}).start();
-
}
-
/**
-
* 处理连接
-
* @param socket
-
*/
-
public static void handleSocket(Socket socket) {
-
new Thread(new Runnable() {
-
@Override
-
public void run() {
-
try {
-
MessageHandler.sendMessage(socket.getOutputStream(), “test”, new HashMap<>());
-
String message = MessageHandler.parseMessage(socket.getInputStream());
-
if (isNotEmpty(appIdMessageDto)) {
-
if (appIdMessageDto.isSuccess()) {
-
//添加到SocketPools中
-
SocketHandler.addScoket(appId, socket);
-
}
-
}
-
} catch (IOException e) {
-
e.printStackTrace();
-
} catch (Exception e) {
-
System.out.println(“—————-” + e.getMessage());
-
}
-
}
-
}).start();
-
}
-
}
-
public class MessageHandler {
-
private static final String key = “***********************”;
-
private static final Logger LOGGER = LoggerFactory.getLogger(MessageHandler.class);
-
//发送数据到客户端
-
public static void sendMessage(OutputStream os, String command, Map<String, String> data) {
-
try {
-
Map<String, Object> params = new HashMap<>();
-
params.put(“command”, command);
-
//签名
-
String sign = getSign(data);
-
params.put(“sign”, sign);
-
LOGGER.debug(“——-send—-sign——–” + sign);
-
if (isNotEmpty(data)) {
-
params.put(“data”, JSON.toJSONString(data));
-
} else {
-
params.put(“data”, “”);
-
}
-
DataOutputStream out = new DataOutputStream(os);
-
StringBuilder str = new StringBuilder();
-
out.writeUTF(JSON.toJSONString(params ));
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
public static void sendMessage(String appId, String command, Map<String, String> data) {
-
Socket socket = SocketHandler.getSocket(appId);
-
if (isEmpty(socket)) {
-
throw new MonkeyException(“socket is empty”);
-
}
-
try {
-
sendMessage(socket.getOutputStream(), command, data);
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
//获取客户端返回的消息
-
public static String parseMessage(String appId) throws Exception {
-
Socket socket = SocketHandler.getSocket(appId);
-
DataInputStream in = new DataInputStream(socket.getInputStream());
-
String message = in.readUTF();
-
String messageString = checkMessageString(message);
-
if (!resultCheckSign(messageString)) {
-
throw new Exception(“sign error”);
-
}
-
return messageString;
-
}
-
public static String checkMessageString(String message) {
-
if (isNotEmpty(message)) {
-
if (message.startsWith(“***”) && message.endsWith(“***”)) {
-
int start = message.indexOf(“{“);
-
int end = message.lastIndexOf(“}”);
-
String substring = message.substring(start, end + 1);
-
return substring;
-
}
-
}
-
throw new Exception(“返回的消息不完整”);
-
}
-
public static String parseMessage(InputStream inputStream) throws Exception {
-
DataInputStream in = new DataInputStream(inputStream);
-
String message = in.readUTF();
-
String messageString = checkMessageString(message);
-
if (!resultCheckSign(messageString)) {
-
throw new Exception(“sign error”);
-
}
-
return messageString;
-
}
-
public static Boolean resultCheckSign(String message) {
-
JSONObject jsonObject = JSON.parseObject(message);
-
if (isNotEmpty(jsonObject)) {
-
String sign = jsonObject.getString(“sign”);
-
LOGGER.debug(“——–return–sign——–” + sign);
-
String dataStr = jsonObject.getString(“data”);
-
if (isNotEmpty(dataStr)) {
-
return SignUtils.checkRoadGateSign(dataStr, key, sign);
-
} else {
-
return SignUtils.checkRoadGateSign(“”, key, sign);
-
}
-
}
-
return false;
-
}
-
public static String getSign(Map<String, String> data) {
-
String preStr = “”;
-
if (isNotEmpty(data)) {
-
preStr = JSON.toJSONString(data);
-
String sign = MD5.sign(preStr, “&salt=” + key, “utf-8″);
-
return sign;
-
}
-
public class SocketHandler {
-
private static ConcurrentMap<String, Socket> socketPools = new ConcurrentHashMap<>();
-
public static void addScoket(String appId, Socket socket) {
-
socketPools.put(appId, socket);
-
}
-
//这里是保证线程同步
-
public static synchronized Socket getSocket(String appId) {
-
return socketPools.get(appId);
-
}
-
}
-
public class SignUtils {
-
/**
-
* <一句话功能简述>
-
* <功能详细描述>验证返回参数
-
*
-
* @param params
-
* @param key
-
* @return
-
* @see [类、类#方法、类#成员]
-
*/
-
public static boolean checkParam(Map<String, String> params, String key) {
-
boolean result = false;
-
if (params.containsKey(“sign”)) {
-
String sign = params.get(“sign”);
-
params.remove(“sign”);
-
StringBuilder buf = new StringBuilder((params.size() + 1) * 10);
-
SignUtils.buildPayParams(buf, params, false);
-
String preStr = buf.toString();
-
String signRecieve = MD5.sign(preStr, “&key=” + key, “utf-8″);
-
result = sign.equalsIgnoreCase(signRecieve);
-
}
-
return result;
-
}
-
public static boolean checkRoadGateSign(String params, String key, String sign) {
-
boolean result = false;
-
if (params != null && params != “” && params.length() > 0) {
-
String signRecieve = MD5.sign(params, “&salt=” + key, “utf-8″);
-
return sign.equalsIgnoreCase(signRecieve);
-
}
-
String signRecieve = MD5.sign(“”, “salt=” + key, “utf-8″);
-
result = sign.equalsIgnoreCase(signRecieve);
-
return result;
-
}
-
/**
-
* 过滤参数
-
*
-
* @param sArray
-
* @return
-
* @author
-
*/
-
public static Map<String, String> paraFilter(Map<String, String> sArray) {
-
Map<String, String> result = new HashMap<>(sArray.size());
-
if (sArray.size() <= 0) {
-
return result;
-
}
-
for (String key : sArray.keySet()) {
-
String value = sArray.get(key);
-
if (value == null || value.equals(“”) || key.equalsIgnoreCase(“sign”) || key.equalsIgnoreCase(“access_token”)) {
-
continue;
-
}
-
result.put(key, value);
-
}
-
return result;
-
}
-
/**
-
* <一句话功能简述>
-
* <功能详细描述>将map转成String
-
*
-
* @param payParams
-
* @return
-
* @see [类、类#方法、类#成员]
-
*/
-
public static String payParamsToString(Map<String, String> payParams) {
-
return payParamsToString(payParams, false);
-
}
-
public static String payParamsToString(Map<String, String> payParams, boolean encoding) {
-
return payParamsToString(new StringBuilder(), payParams, encoding);
-
}
-
/**
-
* @param payParams
-
* @return
-
* @author
-
*/
-
public static String payParamsToString(StringBuilder sb, Map<String, String> payParams, boolean encoding) {
-
buildPayParams(sb, payParams, encoding);
-
return sb.toString();
-
}
-
/**
-
* @param payParams
-
* @return
-
* @author
-
*/
-
public static void buildPayParams(StringBuilder sb, Map<String, String> payParams, boolean encoding) {
-
List<String> keys = new ArrayList<String>(payParams.keySet());
-
Collections.sort(keys);
-
for (String key : keys) {
-
sb.append(key).append(“=”);
-
if (encoding) {
-
sb.append(urlEncode(payParams.get(key)));
-
} else {
-
sb.append(payParams.get(key));
-
}
-
sb.append(“&”);
-
}
-
sb.setLength(sb.length() – 1);
-
}
-
public static String urlEncode(String str) {
-
try {
-
return URLEncoder.encode(str, “UTF-8″);
-
} catch (Throwable e) {
-
return str;
-
}
-
}
-
public static Element readerXml(String body, String encode) throws DocumentException {
-
SAXReader reader = new SAXReader(false);
-
InputSource source = new InputSource(new StringReader(body));
-
source.setEncoding(encode);
-
Document doc = reader.read(source);
-
Element element = doc.getRootElement();
-
return element;
-
}
-
public static String sortMapKey(Map<String, String> map) {
-
List<Map.Entry<String, String>> infoIds = new ArrayList(map.entrySet());
-
infoIds.sort(Comparator.comparing((o) -> {
-
return (String) o.getKey();
-
}));
-
StringBuilder buf = new StringBuilder();
-
Iterator var3 = infoIds.iterator();
-
while (var3.hasNext()) {
-
Map.Entry<String, String> item = (Map.Entry) var3.next();
-
if (StringUtils.isNotBlank((CharSequence) item.getKey())) {
-
String key = (String) item.getKey();
-
String val = (String) item.getValue();
-
buf.append(key).append(“=”).append(val);
-
buf.append(“&”);
-
}
-
}
-
String buff = buf.toString();
-
if (!buff.isEmpty()) {
-
buff = buff.substring(0, buff.length() – 1);
-
}
-
return buff;
-
}
}
-
public class MD5 {
-
/**
-
* 签名字符串
-
* @param text 需要签名的字符串
-
* @param key 密钥
-
* @param input_charset 编码格式
-
* @return 签名结果
-
*/
-
public static String sign(String text, String key, String input_charset) {
-
text = text + key;
-
return DigestUtils.md5Hex(getContentBytes(text, input_charset));
-
}
-
/**
-
* 签名字符串
-
* @param text 需要签名的字符串
-
* @param sign 签名结果
-
* @param key 密钥
-
* @param input_charset 编码格式
-
* @return 签名结果
-
*/
-
public static boolean verify(String text, String sign, String key, String input_charset) {
-
text = text + key;
-
String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));
-
if(mysign.equals(sign)) {
-
return true;
-
}
-
else {
-
return false;
-
}
-
}
-
/**
-
* @param content
-
* @param charset
-
* @return
-
* @throws SignatureException
-
* @throws UnsupportedEncodingException
-
*/
-
private static byte[] getContentBytes(String content, String charset) {
-
if (charset == null || “”.equals(charset)) {
-
return content.getBytes();
-
}
-
try {
-
return content.getBytes(charset);
-
} catch (UnsupportedEncodingException e) {
-
throw new RuntimeException(“MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:” + charset);
-
}
-
}
-
}