lifuquan 2 лет назад
Родитель
Сommit
e9183ce8b5
21 измененных файлов с 371 добавлено и 521 удалено
  1. BIN
      bin/smsBlacklistRemoveApi-exec.jar
  2. BIN
      bin/test/smsBlacklistRemoveApi-exec_test.jar
  3. 7 4
      doc/短信黑名单接口说明文档.md
  4. 44 11
      src/main/java/com/nokia/sms/blacklist/BlkDelClient.java
  5. 25 83
      src/main/java/com/nokia/sms/blacklist/client/BlacklistTcpClient.java
  6. 5 0
      src/main/java/com/nokia/sms/blacklist/exception/ConnectionOutOfSyncException.java
  7. 73 15
      src/main/java/com/nokia/sms/blacklist/message/ClientMessageUtil.java
  8. 0 38
      src/main/java/com/nokia/sms/blacklist/message/ClientParseUtil.java
  9. 102 0
      src/main/java/com/nokia/sms/blacklist/message/ServerMessageUtil.java
  10. 0 48
      src/main/java/com/nokia/sms/blacklist/message/ServerParseUtil.java
  11. 0 50
      src/main/java/com/nokia/sms/blacklist/message/SmitActiveTestMessage.java
  12. 0 45
      src/main/java/com/nokia/sms/blacklist/message/SmitActiveTestRespMessage.java
  13. 0 44
      src/main/java/com/nokia/sms/blacklist/message/SmitBindRespMessage.java
  14. 0 49
      src/main/java/com/nokia/sms/blacklist/message/SmitDelblkRespMessage.java
  15. 0 55
      src/main/java/com/nokia/sms/blacklist/server/BlacklistTcpServer.java
  16. 97 0
      src/main/java/com/nokia/sms/blacklist/server/BlkDelServer.java
  17. 0 40
      src/main/java/com/nokia/sms/blacklist/server/ServerSimulation.java
  18. 0 33
      src/main/java/com/nokia/sms/blacklist/server/ServerSimulationRunnable.java
  19. 8 5
      src/main/java/com/nokia/sms/controller/BlacklistController.java
  20. 9 0
      src/main/java/com/nokia/sms/vo/DelBlkResp.java
  21. 1 1
      src/main/resources/application.properties

BIN
bin/smsBlacklistRemoveApi-exec.jar


BIN
bin/test/smsBlacklistRemoveApi-exec_test.jar


+ 7 - 4
doc/短信黑名单接口说明文档.md

@@ -15,7 +15,7 @@ Content-Type: application/json
 ## 接口2: 黑名单解除接口
 
 ```http
-POST HTTP://133.96.94.108:12120/sms/blacklist/api/remove/
+POST HTTP://127.0.0.1:12110/sms/blacklist/api/remove/
 Content-Type: application/json
 
 {
@@ -29,13 +29,16 @@ Content-Type: application/json
 HTTP/1.1 200 
 Content-Type: application/json
 Transfer-Encoding: chunked
-Date: Mon, 01 Aug 2022 01:25:56 GMT
+Date: Mon, 01 Aug 2022 02:18:48 GMT
 Connection: close
 
 {
   "success": true,
   "code": 200,
-  "message": "成功解除黑名单",
-  "data": null
+  "message": "成功",
+  "data": {
+    "delBlkSuccess": true,
+    "delBlkMessage": "成功解除黑名单"
+  }
 }
 ```

+ 44 - 11
src/main/java/com/nokia/sms/blacklist/BlkDelClient.java

@@ -6,13 +6,12 @@ import java.io.OutputStream;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.Socket;
-import java.net.UnknownHostException;
 import java.security.NoSuchAlgorithmException;
 
 import com.nokia.sms.blacklist.exception.ConnectFailedException;
+import com.nokia.sms.blacklist.exception.ConnectionOutOfSyncException;
 import com.nokia.sms.blacklist.exception.PhoneNumberCanNotBeNullException;
 import com.nokia.sms.blacklist.message.ClientMessageUtil;
-import com.nokia.sms.blacklist.message.ClientParseUtil;
 import com.nokia.sms.blacklist.message.entity.BindRespStatus;
 import com.nokia.sms.blacklist.message.entity.DelBlkBody;
 import com.nokia.sms.blacklist.message.entity.DelBlkRespStatus;
@@ -32,15 +31,25 @@ public class BlkDelClient {
     // 0 - 4294967295 0xFFFFFFFF
     private long sequenceNumber;
 
+    private String systemId = "smsTousu";
+    private String password = "123456";
+
     // 限制产生多个对象
     private BlkDelClient() {
     }
 
+    public static void main(String[] args)
+            throws NoSuchAlgorithmException, IOException, ConnectFailedException, ConnectionOutOfSyncException {
+        BlkDelClient blkDelClient = new BlkDelClient();
+        blkDelClient.connect();
+    }
+
     /*
      * 对外提供服务 删除黑名单
      */
     public void delBlk(String phoneNumber)
-            throws IOException, NoSuchAlgorithmException, ConnectFailedException, PhoneNumberCanNotBeNullException {
+            throws IOException, NoSuchAlgorithmException, ConnectFailedException, PhoneNumberCanNotBeNullException,
+            ConnectionOutOfSyncException {
         log.debug("开始删除短信黑名单,号码 {} ", phoneNumber);
 
         // 1. 检查连接状态
@@ -60,7 +69,7 @@ public class BlkDelClient {
     private DelBlkRespStatus doDelBlk(String phoneNumber) throws PhoneNumberCanNotBeNullException, IOException {
         DelBlkBody delBlkBody = new DelBlkBody(phoneNumber);
         // 发送消息
-        byte[] smitDelBlk = ClientMessageUtil.getSmitDelBlkMessage(delBlkBody);
+        byte[] smitDelBlk = ClientMessageUtil.getSmitDelBlkMessage(delBlkBody, getNextSequence());
         outputStream.write(smitDelBlk);
         outputStream.flush();
         log.debug("已发送绑定请求消息 SMIT_BIND");
@@ -69,13 +78,14 @@ public class BlkDelClient {
         int count = inputStream.read(resp);
         log.debug("收到服务器回复...长度 {} 字节", count);
         // 解析消息
-        return ClientParseUtil.parseSmitDelBlkRespMessage(resp);
+        return ClientMessageUtil.parseSmitDelBlkRespMessage(resp);
     }
 
     /*
      * 连接到服务器
      */
-    private void connect() throws IOException, NoSuchAlgorithmException, ConnectFailedException {
+    private void connect()
+            throws IOException, NoSuchAlgorithmException, ConnectFailedException, ConnectionOutOfSyncException {
         socket = new Socket();
         InetAddress address = InetAddress.getByName(BlkConfig.getConfig("blkServer.ipAddress"));
         int port = Integer.parseInt(BlkConfig.getConfig("blkServer.port"));
@@ -86,7 +96,7 @@ public class BlkDelClient {
         inputStream = socket.getInputStream();
         outputStream = socket.getOutputStream();
         // 向客户端发送 绑定请求
-        byte[] smitBind = ClientMessageUtil.getSmitBindMessage();
+        byte[] smitBind = ClientMessageUtil.getSmitBindMessage(systemId, password);
         outputStream.write(smitBind);
         outputStream.flush();
         log.debug("已发送绑定请求消息 SMIT_BIND");
@@ -95,10 +105,11 @@ public class BlkDelClient {
         int count = inputStream.read(resp);
         log.debug("收到服务器回复...长度 {} 字节", count);
         // 解析消息
-        BindRespStatus status = ClientParseUtil.parseSmitBindRespMessage(resp);
+        BindRespStatus status = ClientMessageUtil.parseSmitBindRespMessage(resp);
         if (BindRespStatus.SUCCESS.equals(status)) {
             connected = true;
             log.info("服务器连接成功!!!");
+            startHeartbeat();
         } else {
             log.error("服务器连接失败,错误码: {}", status);
             throw new ConnectFailedException("连接失败,状态码 : " + status);
@@ -134,11 +145,33 @@ public class BlkDelClient {
     /*
      * 开启心跳
      */
-    private void startHeartbeat() {
+    private void startHeartbeat() throws ConnectionOutOfSyncException {
         // 一旦开启需要一直发送
         while (true) {
-            int count = 1000;
-            
+            try {
+                // 间隔3000ms
+                Thread.sleep(3000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+            try {
+                // 发送心跳消息
+                long sequenceNumberSend = getNextSequence();
+                byte[] smitActiveTest = ClientMessageUtil.getSmitActiveTestMessage(sequenceNumberSend);
+                outputStream.write(smitActiveTest);
+                outputStream.flush();
+                // 读取心跳消息的返回
+                byte[] buffer = new byte[48];
+                int count = inputStream.read(buffer);
+                log.debug("接收到服务器返回的消息 {} 字节", count);
+                long sequenceNumberReceive = ClientMessageUtil.parseSmitActiveTestRespMessage(buffer);
+                if (sequenceNumberReceive != sequenceNumberSend) {
+                    throw new ConnectionOutOfSyncException();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
         }
     }
 

+ 25 - 83
src/main/java/com/nokia/sms/blacklist/client/BlacklistTcpClient.java

@@ -4,11 +4,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.Socket;
-import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
 
-import com.nokia.sms.blacklist.message.ClientMessageUtil;
-
-import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -21,92 +18,37 @@ public class BlacklistTcpClient {
     // ip和端口号用户名密码 由 河北联通垃圾短信黑名单系统 提供
     private static String hostIp = "localhost";
     private static int hostPort = 50000;
-    @Getter
-    private String systemId = "smsTousu";
-    @Getter
-    private String password = "123456";
-    // 0 - 4294967295 0xFFFFFFFF
-    private long sequenceNumber;
-
-    /**
-     * 解除黑名单
-     * 
-     * @param phoneNumber
-     */
-    public void removeBlacklist(String phoneNumber) {
-        // 获取socket连接
-        Socket client = getSocketConnect();
-        // 发送解除黑名单请求
-        sendMessage(client, getRemoveBlacklistMessage());
-        // 解析解除黑名单请求回应
-    }
-
-    private byte[] getRemoveBlacklistMessage() {
-        return null;
-    }
-
-    public long getNextSequence() {
-        if (sequenceNumber < 4294967295L) {
-            return sequenceNumber + 1L;
-        } else {
-            return 0L;
-        }
-    }
-
-    /**
-     * 获取socket连接
-     * 
-     * @return
-     */
-    private Socket getSocketConnect() {
-        // 创建socket客户端
-        try (Socket client = new Socket(hostIp, hostPort);
-                OutputStream outputStream = client.getOutputStream();
-                InputStream inputStream = client.getInputStream()) {
-            // 向服务器发送连接请求
-            sendMessage(client, new byte[0]);
-            // 解析服务器返回消息
-
-            // 返回socket连接
-
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    private byte[] sendMessage(Socket socket, byte[] message) {
-
-        return null;
-    }
 
     public static void main(String[] args) {
-        BlacklistTcpClient client = new BlacklistTcpClient();
-        ClientMessageUtil.setClient(client);
-
-        try (Socket socket = new Socket(hostIp, hostPort);
-                OutputStream outputStream = socket.getOutputStream();
-                InputStream inputStream = socket.getInputStream()) {
-
-            // socket.setSoTimeout(3000);
-
-            outputStream.write(ClientMessageUtil.getSmitBindMessage());
-            outputStream.flush();
-            byte[] buffer = new byte[128];
-            int readCount = inputStream.read(buffer);
-            log.debug("收到 {} 字节消息", readCount);
-
-            log.debug("默认的超时配置: {} ", socket.getSoTimeout());
+        Socket socket = null;
+        try {
+            socket = new Socket(hostIp, hostPort);
+            OutputStream outputStream = socket.getOutputStream();
+            InputStream inputStream = socket.getInputStream();
+            byte[] message = new byte[5];
+            System.arraycopy("abcd".getBytes(), 0, message, 1, 4);
             while (true) {
-                if (socket.isClosed()) {
-                    break;
+                try {
+                    Thread.sleep(1000*3);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
                 }
+                outputStream.write(message);
+                outputStream.flush();
+                byte[] buffer = new byte[5];
+                int readCount = inputStream.read(buffer);
+                log.debug("收到 {} 字节消息", readCount);
+                log.debug("收到的消息是 {} ", Arrays.toString(buffer));
+                message[0]++;
             }
-
         } catch (IOException e) {
             e.printStackTrace();
-        } catch (NoSuchAlgorithmException e) {
-            e.printStackTrace();
+        } finally {
+            try {
+                socket.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
         }
     }
 

+ 5 - 0
src/main/java/com/nokia/sms/blacklist/exception/ConnectionOutOfSyncException.java

@@ -0,0 +1,5 @@
+package com.nokia.sms.blacklist.exception;
+
+public class ConnectionOutOfSyncException extends Throwable {
+
+}

+ 73 - 15
src/main/java/com/nokia/sms/blacklist/message/ClientMessageUtil.java

@@ -6,28 +6,21 @@ import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
-import com.nokia.sms.blacklist.client.BlacklistTcpClient;
+import com.nokia.sms.blacklist.exception.ParseException;
 import com.nokia.sms.blacklist.exception.PhoneNumberCanNotBeNullException;
+import com.nokia.sms.blacklist.message.entity.BindRespStatus;
 import com.nokia.sms.blacklist.message.entity.CommandId;
 import com.nokia.sms.blacklist.message.entity.DelBlkBody;
-
-import lombok.Setter;
+import com.nokia.sms.blacklist.message.entity.DelBlkRespStatus;
 
 public class ClientMessageUtil {
 
-    @Setter
-    private static BlacklistTcpClient client;
-
     private static final DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
 
-    public ClientMessageUtil() {
-
-    }
-
     /*
      * SMIT_BIND 0x00000001 绑定请求
      */
-    public static byte[] getSmitBindMessage() throws NoSuchAlgorithmException {
+    public static byte[] getSmitBindMessage(String systemId, String password) throws NoSuchAlgorithmException {
         // 初始化header
         MessageHeader header = new MessageHeader();
         // header 12 + body 16+20 所以是48字节
@@ -42,11 +35,11 @@ public class ClientMessageUtil {
         System.arraycopy(header.toByteArray(), 0, message, 0, 12);
 
         // 填充systemId
-        byte[] systemIdByteArray = client.getSystemId().getBytes();
+        byte[] systemIdByteArray = systemId.getBytes();
         System.arraycopy(systemIdByteArray, 0, message, 12, systemIdByteArray.length);
 
         // 填充AuthCode
-        String authCodeString = client.getPassword() + dateFormat.format(new Date());
+        String authCodeString = password + dateFormat.format(new Date());
         MessageDigest digest = MessageDigest.getInstance("SHA-1");
         // sha1以后为20字节
         System.arraycopy(digest.digest(authCodeString.getBytes()), 0, message, 28, 20);
@@ -56,14 +49,15 @@ public class ClientMessageUtil {
     /*
      * SMIT_DELBLK 0x00000003 解除黑名单请求
      */
-    public static byte[] getSmitDelBlkMessage(DelBlkBody delBlkBody) throws PhoneNumberCanNotBeNullException {
+    public static byte[] getSmitDelBlkMessage(DelBlkBody delBlkBody, long sequenceNumber)
+            throws PhoneNumberCanNotBeNullException {
         // 初始化header
         MessageHeader header = new MessageHeader();
         // header 12 + body 21 + 1 + 1 + 1 所以是36字节
         header.setMessageLength(36);
         header.setCommandId(CommandId.SMIT_DELBLK);
         // 从客户端获取下一个序号
-        header.setSequenceNumber(client.getNextSequence());
+        header.setSequenceNumber(sequenceNumber);
         // 初始化
         byte[] message = new byte[header.getMessageLength()];
         // 填充header
@@ -81,4 +75,68 @@ public class ClientMessageUtil {
         message[35] = delBlkBody.getProvince_code();
         return message;
     }
+
+    /*
+     * SMIT_ACTIVE_TEST 0x0000000f 链路检测
+     */
+    public static byte[] getSmitActiveTestMessage(long sequenceNumber) {
+        // 初始化header
+        MessageHeader header = new MessageHeader();
+        // header 12 + body 0 所以是12字节
+        header.setMessageLength(12);
+        header.setCommandId(CommandId.SMIT_ACTIVE_TEST);
+        // 从客户端获取下一个序号
+        header.setSequenceNumber(sequenceNumber);
+        // 初始化
+        byte[] message = new byte[header.getMessageLength()];
+        // 填充header
+        System.arraycopy(header.toByteArray(), 0, message, 0, 12);
+        return message;
+    }
+
+    /*
+     * SMIT_BIND_RESP 0x80000001 绑定应答
+     */
+    public static BindRespStatus parseSmitBindRespMessage(byte[] message) {
+        try {
+            MessageHeader header = MessageHeader.parse(message);
+            if (header.getCommandId().equals(CommandId.SMIT_BIND_RESP)) {
+                return BindRespStatus.parse(message[12]);
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /*
+     * SMIT_DELBLK_RESP 0x80000003 解除黑名单应答
+     */
+    public static DelBlkRespStatus parseSmitDelBlkRespMessage(byte[] message) {
+        try {
+            MessageHeader header = MessageHeader.parse(message);
+            if (header.getCommandId().equals(CommandId.SMIT_DELBLK_RESP)) {
+                return DelBlkRespStatus.parse(message[12]);
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /*
+     * SMIT_ACTIVE_TEST_RESP 0x8000000f 链路检测应答
+     */
+    public static long parseSmitActiveTestRespMessage(byte[] message) {
+        try {
+            MessageHeader header = MessageHeader.parse(message);
+            // 判断消息类型
+            if (CommandId.SMIT_ACTIVE_TEST_RESP.equals(header.getCommandId())) {
+                return header.getSequenceNumber();
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return -1;
+    }
 }

+ 0 - 38
src/main/java/com/nokia/sms/blacklist/message/ClientParseUtil.java

@@ -1,38 +0,0 @@
-package com.nokia.sms.blacklist.message;
-
-import com.nokia.sms.blacklist.exception.ParseException;
-import com.nokia.sms.blacklist.message.entity.BindRespStatus;
-import com.nokia.sms.blacklist.message.entity.CommandId;
-import com.nokia.sms.blacklist.message.entity.DelBlkRespStatus;
-
-public class ClientParseUtil {
-    /*
-     * SMIT_BIND_RESP 0x80000001 绑定应答
-     */
-    public static BindRespStatus parseSmitBindRespMessage(byte[] message) {
-        try {
-            MessageHeader header = MessageHeader.parse(message);
-            if (header.getCommandId().equals(CommandId.SMIT_BIND_RESP)) {
-                return BindRespStatus.parse(message[12]);
-            }
-        } catch (ParseException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    /*
-     * SMIT_DELBLK 0x00000003 解除黑名单请求
-     */
-    public static DelBlkRespStatus parseSmitDelBlkRespMessage(byte[] message) {
-        try {
-            MessageHeader header = MessageHeader.parse(message);
-            if (header.getCommandId().equals(CommandId.SMIT_DELBLK_RESP)) {
-                return DelBlkRespStatus.parse(message[12]);
-            }
-        } catch (ParseException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-}

+ 102 - 0
src/main/java/com/nokia/sms/blacklist/message/ServerMessageUtil.java

@@ -1,10 +1,27 @@
 package com.nokia.sms.blacklist.message;
 
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+
+import com.nokia.sms.blacklist.exception.ParseException;
 import com.nokia.sms.blacklist.message.entity.BindRespStatus;
 import com.nokia.sms.blacklist.message.entity.CommandId;
 
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
 public class ServerMessageUtil {
+    private static final String systemId = "smsTousu";
+    private static final String password = "123456";
+    private static final DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
 
+    /*
+     * SMIT_BIND_RESP 0x80000001 绑定应答
+     */
     public static byte[] getSmitBindRespMessage(BindRespStatus status) {
         // 初始化header
         MessageHeader header = new MessageHeader();
@@ -22,4 +39,89 @@ public class ServerMessageUtil {
         message[12] = status.value;
         return message;
     }
+
+    /*
+     * SMIT_ACTIVE_TEST_RESP 0x8000000f 链路检测应答
+     */
+    public static byte[] getSmitActiveTestRespMessage(long sequenceNumber) {
+        // 初始化header
+        MessageHeader header = new MessageHeader();
+        // header 12 + body 0 所以是12字节
+        header.setMessageLength(12);
+        header.setCommandId(CommandId.SMIT_ACTIVE_TEST_RESP);
+        // 从客户端获取下一个序号
+        header.setSequenceNumber(sequenceNumber);
+        // 初始化
+        byte[] message = new byte[header.getMessageLength()];
+        // 填充header
+        System.arraycopy(header.toByteArray(), 0, message, 0, 12);
+        return message;
+    }
+
+    /*
+     * SMIT_DELBLK_RESP 0x80000003 解除黑名单应答
+     */
+    public static byte[] getSmitDelBlkRespMessage() {
+        // TODO
+        return null;
+    }
+
+    /*
+     * 服务端解析
+     */
+    public static byte[] parse(byte[] message) {
+        try {
+            MessageHeader header = MessageHeader.parse(message);
+            log.debug("消息被服务端解析为 {} 消息", header.getCommandId());
+            // 判断消息类型
+            switch (header.getCommandId()) {
+                case SMIT_ACTIVE_TEST:
+                    // 链路检测消息返回 sequenceNumber
+                    return getSmitActiveTestRespMessage(header.getSequenceNumber());
+                case SMIT_DELBLK:
+                    // 解除黑名单消息 返回成功
+                    return getSmitDelBlkRespMessage();
+                case SMIT_BIND:
+                    // 绑定请求消息 返回成功
+                    return getSmitBindRespMessage(parseSmitBindMessage(message));
+                default:
+                    throw new ParseException("消息Command_Id错误");
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /*
+     * SMIT_BIND 0x00000001 绑定请求
+     */
+    public static BindRespStatus parseSmitBindMessage(byte[] message) {
+        try {
+            MessageHeader header = MessageHeader.parse(message);
+            // 判断消息类型
+            if (CommandId.SMIT_BIND.equals(header.getCommandId())) {
+                // 获取并对比systemId
+                byte[] systemIdByteArray = Arrays.copyOfRange(message, 12, 28);
+                if (systemId.equals(new String(systemIdByteArray).trim())) {
+                    // 获取和判断鉴权信息
+                    String authCodeString = password + dateFormat.format(new Date());
+                    MessageDigest digest = MessageDigest.getInstance("SHA-1");
+                    // sha1后的本地字符串
+                    String authCodeLocal = new String(digest.digest(authCodeString.getBytes()));
+                    // 获取到的authCode
+                    String authCode = new String(Arrays.copyOfRange(message, 28, 48));
+                    if (authCodeLocal.equals(authCode)) {
+                        return BindRespStatus.SUCCESS;
+                    }
+                }
+                return BindRespStatus.AUTH_ERROR;
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return BindRespStatus.STRUCTURE_ERROR;
+    }
 }

+ 0 - 48
src/main/java/com/nokia/sms/blacklist/message/ServerParseUtil.java

@@ -1,48 +0,0 @@
-package com.nokia.sms.blacklist.message;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Date;
-
-import com.nokia.sms.blacklist.exception.ParseException;
-import com.nokia.sms.blacklist.message.entity.BindRespStatus;
-import com.nokia.sms.blacklist.message.entity.CommandId;
-
-public class ServerParseUtil {
-
-    private static final String systemId = "smsTousu";
-    private static final String password = "123456";
-    private static final DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
-
-    public static BindRespStatus parseSmitBindMessage(byte[] message) {
-        try {
-            MessageHeader header = MessageHeader.parse(message);
-            // 判断消息类型
-            if (CommandId.SMIT_BIND.equals(header.getCommandId())) {
-                // 获取并对比systemId
-                byte[] systemIdByteArray = Arrays.copyOfRange(message, 12, 28);
-                if (systemId.equals(new String(systemIdByteArray).trim())) {
-                    // 获取和判断鉴权信息
-                    String authCodeString = password + dateFormat.format(new Date());
-                    MessageDigest digest = MessageDigest.getInstance("SHA-1");
-                    // sha1后的本地字符串
-                    String authCodeLocal = new String(digest.digest(authCodeString.getBytes()));
-                    // 获取到的authCode
-                    String authCode = new String(Arrays.copyOfRange(message, 28, 48));
-                    if (authCodeLocal.equals(authCode)) {
-                        return BindRespStatus.SUCCESS;
-                    }
-                }
-                return BindRespStatus.AUTH_ERROR;
-            }
-        } catch (ParseException e) {
-            e.printStackTrace();
-        } catch (NoSuchAlgorithmException e) {
-            e.printStackTrace();
-        }
-        return BindRespStatus.STRUCTURE_ERROR;
-    }
-}

+ 0 - 50
src/main/java/com/nokia/sms/blacklist/message/SmitActiveTestMessage.java

@@ -1,50 +0,0 @@
-package com.nokia.sms.blacklist.message;
-
-import com.nokia.sms.blacklist.client.BlacklistTcpClient;
-import com.nokia.sms.blacklist.exception.ParseException;
-import com.nokia.sms.blacklist.message.entity.CommandId;
-
-/*
- * SMIT_ACTIVE_TEST	0x0000000f	链路检测
- */
-@SuppressWarnings("unused")
-public class SmitActiveTestMessage {
-    private final MessageHeader header;
-
-    private static BlacklistTcpClient CLIENT;
-
-    public SmitActiveTestMessage(BlacklistTcpClient client) {
-        // 初始化header
-        header = new MessageHeader();
-        // header 12 + body 0 所以是12字节
-        header.setMessageLength(12);
-        header.setCommandId(CommandId.SMIT_ACTIVE_TEST);
-        // 从客户端获取下一个序号
-        header.setSequenceNumber(client.getNextSequence());
-        SmitActiveTestMessage.CLIENT = client;
-    }
-
-    public byte[] toByteArray() {
-        // 初始化
-        byte[] message = new byte[header.getMessageLength()];
-        // 填充header
-        System.arraycopy(header.toByteArray(), 0, message, 0, 12);
-        return message;
-    }
-
-    /*
-     * 识别链路检测消息,返回 sequenceNumber
-     */
-    public long parse(byte[] message) {
-        try {
-            MessageHeader header = MessageHeader.parse(message);
-            // 判断消息类型
-            if (CommandId.SMIT_ACTIVE_TEST.equals(header.getCommandId())) {
-                return header.getSequenceNumber();
-            }
-        } catch (ParseException e) {
-            e.printStackTrace();
-        }
-        return -1;
-    }
-}

+ 0 - 45
src/main/java/com/nokia/sms/blacklist/message/SmitActiveTestRespMessage.java

@@ -1,45 +0,0 @@
-package com.nokia.sms.blacklist.message;
-
-import com.nokia.sms.blacklist.exception.ParseException;
-import com.nokia.sms.blacklist.message.entity.CommandId;
-
-/*
- * SMIT_ACTIVE_TEST_RESP	0x8000000f	链路检测应答
- */
-public class SmitActiveTestRespMessage {
-    private final MessageHeader header;
-
-    public SmitActiveTestRespMessage(long sequenceNumber) {
-        // 初始化header
-        header = new MessageHeader();
-        // header 12 + body 0 所以是12字节
-        header.setMessageLength(12);
-        header.setCommandId(CommandId.SMIT_ACTIVE_TEST_RESP);
-        // 从客户端获取下一个序号
-        header.setSequenceNumber(sequenceNumber);
-    }
-
-    public byte[] toByteArray() {
-        // 初始化
-        byte[] message = new byte[header.getMessageLength()];
-        // 填充header
-        System.arraycopy(header.toByteArray(), 0, message, 0, 12);
-        return message;
-    }
-
-    /*
-     * 识别链路检测消息,返回 sequenceNumber
-     */
-    public long parse(byte[] message) {
-        try {
-            MessageHeader header = MessageHeader.parse(message);
-            // 判断消息类型
-            if (CommandId.SMIT_ACTIVE_TEST_RESP.equals(header.getCommandId())) {
-                return header.getSequenceNumber();
-            }
-        } catch (ParseException e) {
-            e.printStackTrace();
-        }
-        return -1;
-    }
-}

+ 0 - 44
src/main/java/com/nokia/sms/blacklist/message/SmitBindRespMessage.java

@@ -1,44 +0,0 @@
-package com.nokia.sms.blacklist.message;
-
-import com.nokia.sms.blacklist.message.entity.BindRespStatus;
-import com.nokia.sms.blacklist.message.entity.CommandId;
-
-public class SmitBindRespMessage {
-    private final MessageHeader header;
-
-    /*
-     * Status 1 Unsigned Integer 否 状态
-     * 见错误码表:
-     * 0:成功
-     * 12:消息结构错
-     * 13:非法源地址
-     * 14:认证错
-     * 21~其它错误
-     */
-    private BindRespStatus status;
-
-    public SmitBindRespMessage() {
-        // 初始化header
-        header = new MessageHeader();
-        // header 12 + body 1 所以是13字节
-        header.setMessageLength(13);
-        header.setCommandId(CommandId.SMIT_BIND_RESP);
-        // 所有的初始连接需要从0开始
-        header.setSequenceNumber(0L);
-    }
-
-    public void setStatus(BindRespStatus status) {
-        this.status = status;
-    }
-
-    public byte[] toByteArray() {
-        // 初始化
-        byte[] message = new byte[header.getMessageLength()];
-        // 填充header
-        System.arraycopy(header.toByteArray(), 0, message, 0, 12);
-
-        // 填充status
-        message[12] = status.value;
-        return message;
-    }
-}

+ 0 - 49
src/main/java/com/nokia/sms/blacklist/message/SmitDelblkRespMessage.java

@@ -1,49 +0,0 @@
-package com.nokia.sms.blacklist.message;
-
-import com.nokia.sms.blacklist.exception.ParseException;
-import com.nokia.sms.blacklist.message.entity.CommandId;
-import com.nokia.sms.blacklist.message.entity.DelBlkRespStatus;
-
-/*
- * SMIT_DELBLK_RESP	0x80000003	解除黑名单应答
- */
-public class SmitDelblkRespMessage {
-    private final MessageHeader header;
-    private DelBlkRespStatus status;
-
-    public SmitDelblkRespMessage(long sequenceNumber) {
-        // 初始化header
-        header = new MessageHeader();
-        // header 12 + body 1 所以是13字节
-        header.setMessageLength(13);
-        header.setCommandId(CommandId.SMIT_DELBLK_RESP);
-        header.setSequenceNumber(sequenceNumber);
-    }
-
-    public void setStatus(DelBlkRespStatus status) {
-        this.status = status;
-    }
-
-    public byte[] toByteArray() {
-        // 初始化
-        byte[] message = new byte[header.getMessageLength()];
-        // 填充header
-        System.arraycopy(header.toByteArray(), 0, message, 0, 12);
-
-        // 填充status
-        message[12] = status.value;
-        return message;
-    }
-
-    public DelBlkRespStatus parse(byte[] message) {
-        try {
-            MessageHeader header = MessageHeader.parse(message);
-            if (header.getCommandId().equals(CommandId.SMIT_DELBLK_RESP)) {
-                return DelBlkRespStatus.parse(message[12]);
-            }
-        } catch (ParseException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-}

+ 0 - 55
src/main/java/com/nokia/sms/blacklist/server/BlacklistTcpServer.java

@@ -1,55 +0,0 @@
-package com.nokia.sms.blacklist.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-import com.nokia.sms.blacklist.message.ServerParseUtil;
-import com.nokia.sms.blacklist.message.ServerMessageUtil;
-import com.nokia.sms.blacklist.message.entity.BindRespStatus;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class BlacklistTcpServer {
-
-    // 服务端口号
-    private static int port = 50000;
-    // 接收连接池的大小,完成TCP三次握手后会放入连接池,等待应用层使用
-    private static int backlog = 1;
-
-    public static void main(String[] args) {
-        
-        // 启动socket服务
-        try (ServerSocket serverSocket = new ServerSocket(port, backlog)) {
-            log.debug("socket服务端已在端口 {} 启动", port);
-            // 接收socket连接
-            Socket socket = serverSocket.accept();
-            log.debug("{}:{}  已上线", socket.getRemoteSocketAddress(), socket.getPort());
-            try (OutputStream outputStream = socket.getOutputStream();
-                    InputStream inputStream = socket.getInputStream()) {
-                
-                socket.setSoTimeout(3000);
-                
-                byte[] buffer = new byte[128];
-                int readCount = inputStream.read(buffer);
-                log.debug("收到 {} 字节 数据", readCount);
-                BindRespStatus status = ServerParseUtil.parseSmitBindMessage(buffer);
-                log.debug("接收到绑定请求", status);
-                byte[] message = ServerMessageUtil.getSmitBindRespMessage(BindRespStatus.SUCCESS);
-                outputStream.write(message);
-                outputStream.flush();
-
-                while (true) {
-                    if (socket.isClosed()) {
-                        break;
-                    }
-                }
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-}

+ 97 - 0
src/main/java/com/nokia/sms/blacklist/server/BlkDelServer.java

@@ -0,0 +1,97 @@
+package com.nokia.sms.blacklist.server;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+
+import com.nokia.sms.blacklist.message.ServerMessageUtil;
+
+import lombok.extern.slf4j.Slf4j;
+
+/*
+ * 模拟服务器
+ */
+@Slf4j
+public class BlkDelServer {
+    // 服务端口号
+    private static int port = 50000;
+    private ServerSocket server = null;
+    private Socket socket = null;
+    private InputStream inputStream = null;
+    private OutputStream outputStream = null;
+    private byte[] buffer = new byte[48];
+    private byte[] message;
+    private int readCount;
+
+    public static void main(String[] args) {
+        BlkDelServer server = new BlkDelServer();
+        server.startServer();
+    }
+
+    private void startServer() {
+        try {
+            // 启动socket服务
+            server = new ServerSocket(port);
+            log.debug("socket服务端已在端口 {} 启动", port);
+            // 接收socket连接
+            Socket socket = server.accept();
+            outputStream = socket.getOutputStream();
+            inputStream = socket.getInputStream();
+            while (true) {
+                // 先读取客户端的输入
+                readCount = inputStream.read(buffer);
+                log.debug("收到 {} 字节 数据", readCount);
+                // 识别消息 并建立 应返回的消息
+                message = ServerMessageUtil.parse(buffer);
+                // 向客户端输出
+                outputStream.write(message);
+                outputStream.flush();
+            }
+        } catch (IOException e) {
+            log.error("服务端运行出错......");
+            e.printStackTrace();
+        } finally {
+            close();
+        }
+    }
+
+    private void close() {
+        if (inputStream != null) {
+            try {
+                inputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        if (outputStream != null) {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        if (server != null) {
+            try {
+                server.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        if (socket != null) {
+            try {
+                socket.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        if (server != null) {
+            try {
+                server.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 0 - 40
src/main/java/com/nokia/sms/blacklist/server/ServerSimulation.java

@@ -1,40 +0,0 @@
-package com.nokia.sms.blacklist.server;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 模拟的服务端
- */
-@Slf4j
-@Deprecated
-public class ServerSimulation {
-
-    // serverPort
-    private static int port = 50000;
-
-    private static int poolSize = 1;
-    private static ExecutorService pool = Executors.newFixedThreadPool(poolSize);
-
-    public static void main(String[] args) {
-        // 启动socket服务
-        try (ServerSocket serverSocket = new ServerSocket(port)) {
-            log.debug("socket服务端已在端口 {} 启动", port);
-            while (true) {
-                // 接收socket连接
-                Socket socket = serverSocket.accept();
-                log.debug("{} 上线", socket.getRemoteSocketAddress());
-                // 创建一条新线程来处理这条连接
-                Runnable runnable = new ServerSimulationRunnable(socket);
-                pool.execute(runnable);
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-}

+ 0 - 33
src/main/java/com/nokia/sms/blacklist/server/ServerSimulationRunnable.java

@@ -1,33 +0,0 @@
-package com.nokia.sms.blacklist.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Deprecated
-public class ServerSimulationRunnable implements Runnable {
-
-    private final Socket socket;
-
-    public ServerSimulationRunnable(Socket socket) {
-        this.socket = socket;
-    }
-
-    @Override
-    public void run() {
-        try (InputStream inputStream = socket.getInputStream();
-                OutputStream outputStream = socket.getOutputStream()) {
-            byte[] buffer = new byte[1024];
-            int readCount = inputStream.read(buffer);
-            log.debug("接收到{}字节数据---", readCount);
-            // outputStream.write();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-}

+ 8 - 5
src/main/java/com/nokia/sms/controller/BlacklistController.java

@@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import com.nokia.common.http.R;
 import com.nokia.sms.service.BlacklistService;
+import com.nokia.sms.vo.DelBlkResp;
 import com.nokia.sms.vo.RequestParms;
 
 import lombok.extern.slf4j.Slf4j;
@@ -43,13 +44,15 @@ public class BlacklistController {
         // 尝试解除黑名单
         log.debug("入参 -- {} ", parms);
         // boolean result = blacklistService.remove(parms);
-        R r;
+        DelBlkResp delBlkResp = new DelBlkResp();
         if (parms.getPhoneNumber().equals("13231899751")) {
-            r = R.ok().message("成功解除黑名单");
+            delBlkResp.setDelBlkSuccess(true);
+            delBlkResp.setDelBlkMessage("成功解除黑名单");
         } else {
-            r = R.error().message("解除黑名单失败");
+            delBlkResp.setDelBlkSuccess(false);
+            delBlkResp.setDelBlkMessage("解除黑名单失败");
         }
-        log.debug("返回 -- {}", r);
-        return r;
+        log.debug("返回 -- {}", delBlkResp);
+        return R.ok().data(delBlkResp);
     }
 }

+ 9 - 0
src/main/java/com/nokia/sms/vo/DelBlkResp.java

@@ -0,0 +1,9 @@
+package com.nokia.sms.vo;
+
+import lombok.Data;
+
+@Data
+public class DelBlkResp {
+    private boolean delBlkSuccess;
+    private String delBlkMessage;
+}

+ 1 - 1
src/main/resources/application.properties

@@ -1,3 +1,3 @@
-server.port=12120
+server.port=12110
 
 logging.level.com.nokia=debug