lifuquan 2 роки тому
батько
коміт
6cac327ac0
23 змінених файлів з 527 додано та 33 видалено
  1. 5 1
      .gitignore
  2. 14 6
      doc/河北垃圾短信监控系统提供的文档/文档中存在的疑问20220725.md
  3. BIN
      doc/河北垃圾短信监控系统提供的文档/河北联通垃圾短信一键解黑接口规范-2022072502.docx
  4. 59 0
      src/main/java/com/nokia/common/io/ByteArrayUtil.java
  5. 11 2
      src/main/java/com/nokia/sms/blacklist/BlacklistTcpClient.java
  6. 25 0
      src/main/java/com/nokia/sms/blacklist/MessagePackagingUtil.java
  7. 4 4
      src/main/java/com/nokia/sms/blacklist/RequestMessageUtil.java
  8. 1 19
      src/main/java/com/nokia/sms/blacklist/ResponMessageUtil.java
  9. 7 0
      src/main/java/com/nokia/sms/blacklist/exception/ParseException.java
  10. 35 0
      src/main/java/com/nokia/sms/blacklist/message/BindRespStatus.java
  11. 31 0
      src/main/java/com/nokia/sms/blacklist/message/CommandId.java
  12. 63 0
      src/main/java/com/nokia/sms/blacklist/message/MessageHeader.java
  13. 8 0
      src/main/java/com/nokia/sms/blacklist/message/SmitActiveTestMessage.java
  14. 8 0
      src/main/java/com/nokia/sms/blacklist/message/SmitActiveTestRespMessage.java
  15. 78 0
      src/main/java/com/nokia/sms/blacklist/message/SmitBindMessage.java
  16. 55 0
      src/main/java/com/nokia/sms/blacklist/message/SmitBindRespMessage.java
  17. 8 0
      src/main/java/com/nokia/sms/blacklist/message/SmitDelblkMessage.java
  18. 8 0
      src/main/java/com/nokia/sms/blacklist/message/SmitDelblkRespMessage.java
  19. 39 0
      src/main/java/com/nokia/sms/blacklist/server/ServerSimulation.java
  20. 32 0
      src/main/java/com/nokia/sms/blacklist/server/ServerSimulationRunnable.java
  21. 1 0
      src/main/java/com/nokia/sms/service/BlacklistService.java
  22. 1 1
      src/test/java/com/nokia/sms/blacklist/RequestMessageUtilTest.java
  23. 34 0
      src/test/java/com/nokia/sms/blacklist/TestSocketClient.java

+ 5 - 1
.gitignore

@@ -1 +1,5 @@
-target/
+target/
+# office 临时文件
+~$*
+# vscode 编程环境
+.vscode/

+ 14 - 6
doc/河北垃圾短信监控系统提供的文档/文档中存在的疑问20220725.md

@@ -1,17 +1,25 @@
 # 接口文档中的疑问
 
-1. `C-Octet String	以NULL结束的字符串` 和 `Octet String	无NULL结束` 这里的 C-Octet String 需要如何处理
+1. `C-Octet String 以NULL结束的字符串` 和 `Octet String 无NULL结束` 这里的 C-Octet String 需要如何处理
 
-解答: 末尾添加\0(0x00)
+    解答: 末尾添加\0(0x00)
 
-补充提问: `Authcode` 值为共享的认证密码(由垃圾短信监控系统与短信投诉处理系统分别共享)和当前日期经过SHA-1散列后的输出, 这个字段也要求是`20`字节的`C-Octet String`,但是sha1以后就是20字节了,0x00添加在哪儿?
+    补充提问: `AuthCode` 值为共享的认证密码(由垃圾短信监控系统与短信投诉处理系统分别共享)和当前日期经过SHA-1散列后的输出, 这个字段也要求是`20`字节的`C-Octet String`,但是sha1以后就是20字节了,0x00添加在哪儿?
+
+    答案: 补全的意思是从0位开始写入,如果位数不足,在末尾填入0x00
 
 2. `SMIT_ACTIVE_TEST` 时间间隔是多少
 
+    建议15秒
+
 3. 解除黑名单请求定义中 `blk_Num` 如何区分 `点对点和网间用户` 和 `端口用户`
 
-4. 解除黑名单请求定义中 `blk_type` 如何区分 `主叫黑名单` 和 `被叫黑名单`  河北垃圾短信监控系统向投诉平台同步黑名单号码接口规范 这个规范里提供的字段不包括`主叫黑名单` 和 `被叫黑名单`
+    不需要带86
+
+4. 解除黑名单请求定义中 `blk_type` 如何区分 `主叫黑名单` 和 `被叫黑名单`  河北垃圾短信监控系统向投诉平台同步黑名单号码接口规范 这个规范里提供的字段不包括`主叫黑名单` 和 `被叫黑名单`, 主叫黑名单 是不是不能发短信,被叫黑名单是不是不能收短信?
+
+    仅针对主叫黑名单
 
-主叫黑名单 是不是不能发短信,被叫黑名单是不是不能收短信?
+5. 解除黑名单请求定义中 `province_code` 我们的权限是否仅包含河北省(14), 这里的省份是号码归属省份还是仅仅是这个号码在河北省的黑名单中? 举例,一个山西的号码被添加了河北省黑名单,是不是就是这个山西用户在河北省内漫游时无法收发短信?
 
-5. 解除黑名单请求定义中 `province_code` 我们的权限是否仅包含河北省(14), 这里的省份是号码归属省份还是仅仅是这个号码在河北省的黑名单中? 举例,一个山西的号码被添加了河北省黑名单,是不是就是这个山西用户在河北省内漫游时无法收发短信? 
+    与黑名单省份相关,与号码归属地无关,所以漫游用户也可以用。

BIN
doc/河北垃圾短信监控系统提供的文档/河北联通垃圾短信一键解黑接口规范-2022072502.docx


+ 59 - 0
src/main/java/com/nokia/common/io/ByteArrayUtil.java

@@ -0,0 +1,59 @@
+package com.nokia.common.io;
+
+import java.nio.ByteBuffer;
+
+/**
+ * 整数和字节数组相互转化的工具类
+ */
+public class ByteArrayUtil {
+
+    /**
+     * 从buffer的从offset开始的4个字节中读取一个Integer
+     */
+    public static int parseInteger(byte[] buffer, int offset) {
+        // 识别
+        byte[] byteArr = new byte[4];
+        int size = buffer.length - offset;
+        if (size >= 4) {
+            System.arraycopy(buffer, offset, byteArr, 0, 4);
+        } else {
+            System.arraycopy(buffer, offset, byteArr, 4 - size, size);
+        }
+
+        return ByteBuffer.wrap(byteArr).getInt();
+    }
+
+    /**
+     * 从buffer的从offset开始的4个字节中读取一个无符号整数,以long的类型返回
+     */
+    public static long parseUnsignedInteger(byte[] buffer, int offset) {
+        // 识别
+        byte[] byteArr = new byte[8];
+        int size = buffer.length - offset;
+        if (size >= 4) {
+            System.arraycopy(buffer, offset, byteArr, 4, 4);
+        } else {
+            System.arraycopy(buffer, offset, byteArr, 8 - size, size);
+        }
+
+        return ByteBuffer.wrap(byteArr).getLong();
+    }
+
+    /**
+     * 把int转化成4字节数组
+     */
+    public static byte[] toByteArray(int value) {
+        ByteBuffer buffer = ByteBuffer.allocate(4);
+        buffer.putInt(value);
+        return buffer.array();
+    }
+
+    /*
+     * 把long转成8字节数组
+     */
+    public static byte[] toByteArray(long value) {
+        ByteBuffer buffer = ByteBuffer.allocate(8);
+        buffer.putLong(value);
+        return buffer.array();
+    }
+}

+ 11 - 2
src/main/java/com/nokia/sms/blacklist/BlacklistTcpClient.java

@@ -5,6 +5,8 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.Socket;
 
+import lombok.Getter;
+
 /**
  * 连接河北联通垃圾短信黑名单系统的socket客户端
  * 
@@ -14,8 +16,10 @@ public class BlacklistTcpClient {
     // ip和端口号用户名密码 由 河北联通垃圾短信黑名单系统 提供
     private static String hostIp = "localhost";
     private static int hostPort = 50000;
-    private static String systemId = "smstousu";
-    private static String password = "123456";
+    @Getter
+    private String systemId = "smstousu";
+    @Getter
+    private String password = "123456";
 
     /**
      * 解除黑名单
@@ -61,4 +65,9 @@ public class BlacklistTcpClient {
         return null;
     }
 
+
+    public static void main(String[] args) {
+        
+    }
+
 }

+ 25 - 0
src/main/java/com/nokia/sms/blacklist/MessagePackagingUtil.java

@@ -0,0 +1,25 @@
+package com.nokia.sms.blacklist;
+
+/**
+ * 负责包装各条消息
+ */
+public class MessagePackagingUtil {
+    
+    // SMIT_BIND 0x00000001 绑定请求
+
+
+    // SMIT_BIND_RESP 0x80000001 绑定应答
+
+
+    // SMIT_ACTIVE_TEST 0x0000000f 链路检测
+
+
+    // SMIT_ACTIVE_TEST_RESP 0x8000000f 链路检测应答
+
+
+    // SMIT_DELBLK 0x00000003 解除黑名单请求
+
+
+    // SMIT_DELBLK_RESP 0x80000003 解除黑名单应答
+    
+}

+ 4 - 4
src/main/java/com/nokia/sms/blacklist/RequestMessageUtil.java

@@ -48,11 +48,11 @@ public class RequestMessageUtil {
         System.arraycopy(byteArraySystemId, 0, message, 27 - byteArraySystemId.length,
                 byteArraySystemId.length);
         // authcode 28位开始 共 20位
-        byte[] octetAuthcode = new OctetString(password + dateFormat.format(new Date())).toByteArray();
+        byte[] octetAuthCode = new OctetString(password + dateFormat.format(new Date())).toByteArray();
         MessageDigest digest = MessageDigest.getInstance("SHA-1");
         // sha1后正好20位
-        octetAuthcode = digest.digest(octetAuthcode);
-        System.arraycopy(octetAuthcode, 0, message, 28, 20);
+        octetAuthCode = digest.digest(octetAuthCode);
+        System.arraycopy(octetAuthCode, 0, message, 28, 20);
         log.debug("已完成SMIT_BIND消息组装: {}", Arrays.toString(message));
         return message;
     }
@@ -60,7 +60,7 @@ public class RequestMessageUtil {
     /**
      * 协议中SMIT_ACTIVE_TEST 链路检测请求 消息
      */
-    public static byte[] getSmitAciveTestMessage(long messageCount) {
+    public static byte[] getSmitActiveTestMessage(long messageCount) {
         // header 4+4+4 body为空
         int messageLength = 12;
         byte[] message = new byte[messageLength];

+ 1 - 19
src/main/java/com/nokia/sms/blacklist/ResponMessageUtil.java

@@ -9,23 +9,5 @@ import java.nio.ByteBuffer;
  */
 public class ResponMessageUtil {
 
-    /**
-     * 从buffer的从offset开始的4个字节中读取一个无符号整数,以long的类型返回
-     * 
-     * @param buffer 字节数组
-     * @param offset 起始位置
-     * @return long类型表示的一个无符号整数
-     */
-    private static long getUnsignedIntegerFromBytes(byte[] buffer, int offset) {
-        // 识别
-        byte[] byteArr = new byte[8];
-        int size = buffer.length - offset;
-        if (size >= 4) {
-            System.arraycopy(buffer, offset, byteArr, 4, 4);
-        } else {
-            System.arraycopy(buffer, offset, byteArr, 8 - size, size);
-        }
-
-        return ByteBuffer.wrap(byteArr).getLong();
-    }
+    
 }

+ 7 - 0
src/main/java/com/nokia/sms/blacklist/exception/ParseException.java

@@ -0,0 +1,7 @@
+package com.nokia.sms.blacklist.exception;
+
+public class ParseException extends Throwable {
+    public ParseException(String message) {
+        super(message);
+    }
+}

+ 35 - 0
src/main/java/com/nokia/sms/blacklist/message/BindRespStatus.java

@@ -0,0 +1,35 @@
+package com.nokia.sms.blacklist.message;
+
+/*
+     * Status 1 Unsigned Integer 否 状态
+     * 见错误码表:
+     * 0:成功
+     * 12:消息结构错
+     * 13:非法源地址
+     * 14:认证错
+     * 21~其它错误
+     */
+public enum BindRespStatus {
+    SUCCESS((byte) 0, "成功"),
+    STRUCTURE_ERROR((byte) 12, "消息结构错"),
+    ILLEGAL_SOURCE_IP((byte) 13, "非法源地址"),
+    AUTH_ERROR((byte) 14, "认证错"),
+    OTHER_ERROR((byte) 21, "其他错误");
+
+    public final byte value;
+    public final String status;
+
+    BindRespStatus(byte value, String status) {
+        this.value = value;
+        this.status = status;
+    }
+
+    public static BindRespStatus parse(byte value) {
+        for (BindRespStatus status : values()) {
+            if (value == status.value) {
+                return status;
+            }
+        }
+        return null;
+    }
+}

+ 31 - 0
src/main/java/com/nokia/sms/blacklist/message/CommandId.java

@@ -0,0 +1,31 @@
+package com.nokia.sms.blacklist.message;
+
+/**
+ * Command_Id定义
+ * SMIT_BIND 0x00000001 绑定请求
+ * SMIT_BIND_RESP 0x80000001 绑定应答
+ * SMIT_ACTIVE_TEST 0x0000000f 链路检测
+ * SMIT_ACTIVE_TEST_RESP 0x8000000f 链路检测应答
+ * SMIT_DELBLK 0x00000003 解除黑名单请求
+ * SMIT_DELBLK_RESP 0x80000003 解除黑名单应答
+ */
+public enum CommandId {
+    SMIT_BIND(1L), SMIT_BIND_RESP(2147483649L),
+    SMIT_ACTIVE_TEST(15L), SMIT_ACTIVE_TEST_RESP(2147483663L),
+    SMIT_DELBLK(3L), SMIT_DELBLK_RESP(2147483651L);
+
+    public final long value;
+
+    CommandId(long value) {
+        this.value = value;
+    }
+
+    public static CommandId parse(long value) {
+        for (CommandId commandId : values()) {
+            if (value == commandId.value) {
+                return commandId;
+            }
+        }
+        return null;
+    }
+}

+ 63 - 0
src/main/java/com/nokia/sms/blacklist/message/MessageHeader.java

@@ -0,0 +1,63 @@
+package com.nokia.sms.blacklist.message;
+
+import java.util.Arrays;
+
+import com.nokia.common.io.ByteArrayUtil;
+import com.nokia.sms.blacklist.exception.ParseException;
+
+import lombok.Data;
+
+/**
+ * Message Length 4 Unsigned Integer 消息长度:消息包的总长度(字节)
+ * Command ID 4 Unsigned Integer 消息类型:表明此条消息的类型,采用固定值
+ * Sequence Number 4 Unsigned Integer
+ * 此字段表示消息的序列号,它由请求发起端产生,是消息和它的应答之间的对应标志。数值在0到0XFFFFFFFF间必须保证严格单调的递增,当达到0XFFFFFFFF时,从0开始下一循环。
+ */
+@Data
+public class MessageHeader {
+    // 协议为无符号int 但是实际情况都不超过int
+    private int messageLength;
+    /**
+     * Command_Id定义
+     * SMIT_BIND 0x00000001 绑定请求
+     * SMIT_BIND_RESP 0x80000001 绑定应答
+     * SMIT_ACTIVE_TEST 0x0000000f 链路检测
+     * SMIT_ACTIVE_TEST_RESP 0x8000000f 链路检测应答
+     * SMIT_DELBLK 0x00000003 解除黑名单请求
+     * SMIT_DELBLK_RESP 0x80000003 解除黑名单应答
+     */
+    private CommandId commandId;
+    private long sequenceNumber;
+
+    public byte[] toByteArray() {
+        byte[] header = new byte[12];
+        // messageLength
+        System.arraycopy(ByteArrayUtil.toByteArray(messageLength), 0, header, 0, 4);
+        // commandId
+        System.arraycopy(ByteArrayUtil.toByteArray(commandId.value), 4, header, 4, 4);
+        // sequenceNumber
+        System.arraycopy(ByteArrayUtil.toByteArray(sequenceNumber), 4, header, 4, 4);
+        return header;
+    }
+
+    public static MessageHeader parse(byte[] message) throws ParseException {
+        if (message.length < 12) {
+            throw new ParseException("message header 必须包含12个字节。");
+        }
+        // 获取前12个字节作为header
+        byte[] header = Arrays.copyOf(message, 12);
+        MessageHeader messageHeader = new MessageHeader();
+        // messageLength
+        messageHeader.setMessageLength(ByteArrayUtil.parseInteger(header, 0));
+        // commandId
+        long commandIdValue = ByteArrayUtil.parseUnsignedInteger(header, 4);
+        CommandId commandId = CommandId.parse(commandIdValue);
+        if (null == commandId) {
+            throw new ParseException("无法识别 Command_Id : " + commandIdValue);
+        }
+        messageHeader.setCommandId(commandId);
+        // sequenceNumber
+        messageHeader.setSequenceNumber(ByteArrayUtil.parseUnsignedInteger(header, 8));
+        return messageHeader;
+    }
+}

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

@@ -0,0 +1,8 @@
+package com.nokia.sms.blacklist.message;
+
+/*
+ * SMIT_ACTIVE_TEST	0x0000000f	链路检测
+ */
+public class SmitActiveTestMessage {
+    
+}

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

@@ -0,0 +1,8 @@
+package com.nokia.sms.blacklist.message;
+
+/*
+ * SMIT_ACTIVE_TEST_RESP	0x8000000f	链路检测应答
+ */
+public class SmitActiveTestRespMessage {
+    
+}

+ 78 - 0
src/main/java/com/nokia/sms/blacklist/message/SmitBindMessage.java

@@ -0,0 +1,78 @@
+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.BlacklistTcpClient;
+import com.nokia.sms.blacklist.exception.ParseException;
+
+public class SmitBindMessage {
+    private final MessageHeader header;
+
+    private static BlacklistTcpClient CLIENT;
+
+    private static final DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
+
+    public SmitBindMessage(BlacklistTcpClient client) {
+        // 初始化header
+        header = new MessageHeader();
+        // header 12 + body 16+20 所以是48字节
+        header.setMessageLength(48);
+        header.setCommandId(CommandId.SMIT_BIND);
+        // 所有的初始连接需要从0开始
+        header.setSequenceNumber(0L);
+        SmitBindMessage.CLIENT = client;
+    }
+
+    public byte[] toByteArray() throws NoSuchAlgorithmException {
+        // 初始化
+        byte[] message = new byte[header.getMessageLength()];
+        // 填充header
+        System.arraycopy(header.toByteArray(), 0, message, 0, 12);
+
+        // 填充systemId
+        byte[] systemIdByteArray = SmitBindMessage.CLIENT.getSystemId().getBytes();
+        System.arraycopy(systemIdByteArray, 0, message, 12, systemIdByteArray.length);
+
+        // 填充AuthCode
+        String authCodeString = SmitBindMessage.CLIENT.getPassword() + dateFormat.format(new Date());
+        MessageDigest digest = MessageDigest.getInstance("SHA-1");
+        // sha1以后为20字节
+        System.arraycopy(digest.digest(authCodeString.getBytes()), 0, message, 28, 20);
+        return message;
+    }
+
+    public BindRespStatus parseAndResp(byte[] message) {
+        try {
+            MessageHeader header = MessageHeader.parse(message);
+            // 判断消息类型
+            if (CommandId.SMIT_BIND.equals(header.getCommandId())) {
+                // 获取并对比systemId
+                byte[] systemIdByteArray = Arrays.copyOfRange(message, 12, 28);
+                if (SmitBindMessage.CLIENT.getSystemId().equals(new String(systemIdByteArray).trim())) {
+                    // 获取和判断鉴权信息
+                    String authCodeString = SmitBindMessage.CLIENT.getPassword() + 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;
+    }
+
+}

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

@@ -0,0 +1,55 @@
+package com.nokia.sms.blacklist.message;
+
+import com.nokia.sms.blacklist.exception.ParseException;
+
+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;
+    }
+
+    public BindRespStatus parse(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;
+    }
+}

+ 8 - 0
src/main/java/com/nokia/sms/blacklist/message/SmitDelblkMessage.java

@@ -0,0 +1,8 @@
+package com.nokia.sms.blacklist.message;
+
+/*
+ * SMIT_DELBLK	0x00000003	解除黑名单请求
+ */
+public class SmitDelblkMessage {
+
+}

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

@@ -0,0 +1,8 @@
+package com.nokia.sms.blacklist.message;
+
+/*
+ * SMIT_DELBLK_RESP	0x80000003	解除黑名单应答
+ */
+public class SmitDelblkRespMessage {
+
+}

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

@@ -0,0 +1,39 @@
+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
+public class ServerSimulation {
+
+    // serverPort
+    private static int port = 50000;
+
+    private static int poolSize = 3;
+    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();
+        }
+    }
+}

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

@@ -0,0 +1,32 @@
+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
+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();
+        }
+    }
+
+}

+ 1 - 0
src/main/java/com/nokia/sms/service/BlacklistService.java

@@ -17,6 +17,7 @@ public class BlacklistService {
      * @return
      */
     public boolean remove(RequestParms parms) {
+        
         return false;
     }
 }

+ 1 - 1
src/test/java/com/nokia/sms/blacklist/RequestMessageUtilTest.java

@@ -14,7 +14,7 @@ public class RequestMessageUtilTest {
 
     @Test
     void testGetSmitAciveTestMessage() {
-        byte[] message = RequestMessageUtil.getSmitAciveTestMessage(2);
+        byte[] message = RequestMessageUtil.getSmitActiveTestMessage(2);
         System.out.println(Arrays.toString(message));
     }
 

+ 34 - 0
src/test/java/com/nokia/sms/blacklist/TestSocketClient.java

@@ -0,0 +1,34 @@
+package com.nokia.sms.blacklist;
+
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.security.NoSuchAlgorithmException;
+
+import org.junit.jupiter.api.Test;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class TestSocketClient {
+
+    @Test
+    void test() {
+        try (Socket client = new Socket("localhost", 50000);
+                InputStream inputStream = client.getInputStream();
+                OutputStream outputStream = client.getOutputStream()) {
+            byte[] message = RequestMessageUtil.getSmitBindMessage("admin", "123456");
+            outputStream.write(message);
+            outputStream.flush();
+            log.debug("已发送消息 {}", message);
+            while(true) {}
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+    }
+}