lifuquan 2 vuotta sitten
vanhempi
commit
c57199e625
24 muutettua tiedostoa jossa 439 lisäystä ja 340 poistoa
  1. 21 0
      src/main/java/com/nokia/sms/blacklist/BlkConfig.java
  2. 153 0
      src/main/java/com/nokia/sms/blacklist/BlkDelClient.java
  3. 0 25
      src/main/java/com/nokia/sms/blacklist/MessagePackagingUtil.java
  4. 0 113
      src/main/java/com/nokia/sms/blacklist/RequestMessageUtil.java
  5. 0 13
      src/main/java/com/nokia/sms/blacklist/ResponMessageUtil.java
  6. 32 1
      src/main/java/com/nokia/sms/blacklist/client/BlacklistTcpClient.java
  7. 8 0
      src/main/java/com/nokia/sms/blacklist/exception/ConnectFailedException.java
  8. 84 0
      src/main/java/com/nokia/sms/blacklist/message/ClientMessageUtil.java
  9. 38 0
      src/main/java/com/nokia/sms/blacklist/message/ClientParseUtil.java
  10. 1 1
      src/main/java/com/nokia/sms/blacklist/message/MessageHeader.java
  11. 25 0
      src/main/java/com/nokia/sms/blacklist/message/ServerMessageUtil.java
  12. 6 38
      src/main/java/com/nokia/sms/blacklist/message/ServerParseUtil.java
  13. 1 1
      src/main/java/com/nokia/sms/blacklist/message/SmitActiveTestMessage.java
  14. 0 13
      src/main/java/com/nokia/sms/blacklist/message/SmitBindRespMessage.java
  15. 0 73
      src/main/java/com/nokia/sms/blacklist/message/SmitDelblkMessage.java
  16. 5 0
      src/main/java/com/nokia/sms/blacklist/message/entity/BindRespStatus.java
  17. 1 0
      src/main/java/com/nokia/sms/blacklist/message/entity/DelBlkBody.java
  18. 1 1
      src/main/java/com/nokia/sms/blacklist/message/entity/DelBlkRespStatus.java
  19. 55 0
      src/main/java/com/nokia/sms/blacklist/server/BlacklistTcpServer.java
  20. 2 1
      src/main/java/com/nokia/sms/blacklist/server/ServerSimulation.java
  21. 1 0
      src/main/java/com/nokia/sms/blacklist/server/ServerSimulationRunnable.java
  22. 5 0
      src/main/resources/smsblk.properties
  23. 0 26
      src/test/java/com/nokia/sms/blacklist/RequestMessageUtilTest.java
  24. 0 34
      src/test/java/com/nokia/sms/blacklist/TestSocketClient.java

+ 21 - 0
src/main/java/com/nokia/sms/blacklist/BlkConfig.java

@@ -0,0 +1,21 @@
+package com.nokia.sms.blacklist;
+
+import java.io.IOException;
+import java.util.Properties;
+
+public class BlkConfig {
+
+    private static final Properties PROPERTIES = new Properties();
+
+    static {
+        try {
+            PROPERTIES.load(ClassLoader.getSystemResourceAsStream("smsblk.properties"));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static String getConfig(String name) {
+        return PROPERTIES.getProperty(name);
+    }
+}

+ 153 - 0
src/main/java/com/nokia/sms/blacklist/BlkDelClient.java

@@ -0,0 +1,153 @@
+package com.nokia.sms.blacklist;
+
+import java.io.IOException;
+import java.io.InputStream;
+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.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;
+
+import lombok.extern.slf4j.Slf4j;
+
+/*
+ * 短信一键解封客户端
+ */
+@Slf4j
+public class BlkDelClient {
+    private Socket socket;
+    private InputStream inputStream;
+    private OutputStream outputStream;
+
+    private boolean connected = false;
+    // 0 - 4294967295 0xFFFFFFFF
+    private long sequenceNumber;
+
+    // 限制产生多个对象
+    private BlkDelClient() {
+    }
+
+    /*
+     * 对外提供服务 删除黑名单
+     */
+    public void delBlk(String phoneNumber)
+            throws IOException, NoSuchAlgorithmException, ConnectFailedException, PhoneNumberCanNotBeNullException {
+        log.debug("开始删除短信黑名单,号码 {} ", phoneNumber);
+
+        // 1. 检查连接状态
+        if (!connected) {
+            // 连接状态异常
+            connect();
+        }
+
+        // 2. 暂停发送心跳
+        stopHeartbeat();
+        // 3. 完成删除任务
+        doDelBlk(phoneNumber);
+        // 4. 重新启动心跳
+        startHeartbeat();
+    }
+
+    private DelBlkRespStatus doDelBlk(String phoneNumber) throws PhoneNumberCanNotBeNullException, IOException {
+        DelBlkBody delBlkBody = new DelBlkBody(phoneNumber);
+        // 发送消息
+        byte[] smitDelBlk = ClientMessageUtil.getSmitDelBlkMessage(delBlkBody);
+        outputStream.write(smitDelBlk);
+        outputStream.flush();
+        log.debug("已发送绑定请求消息 SMIT_BIND");
+        // 接收回复消息
+        byte[] resp = new byte[128];
+        int count = inputStream.read(resp);
+        log.debug("收到服务器回复...长度 {} 字节", count);
+        // 解析消息
+        return ClientParseUtil.parseSmitDelBlkRespMessage(resp);
+    }
+
+    /*
+     * 连接到服务器
+     */
+    private void connect() throws IOException, NoSuchAlgorithmException, ConnectFailedException {
+        socket = new Socket();
+        InetAddress address = InetAddress.getByName(BlkConfig.getConfig("blkServer.ipAddress"));
+        int port = Integer.parseInt(BlkConfig.getConfig("blkServer.port"));
+        int connectTimeout = Integer.parseInt(BlkConfig.getConfig("blkServer.connectTimeout"));
+        // 启动socket连接
+        socket.connect(new InetSocketAddress(address, port), connectTimeout);
+        // 绑定输入输出
+        inputStream = socket.getInputStream();
+        outputStream = socket.getOutputStream();
+        // 向客户端发送 绑定请求
+        byte[] smitBind = ClientMessageUtil.getSmitBindMessage();
+        outputStream.write(smitBind);
+        outputStream.flush();
+        log.debug("已发送绑定请求消息 SMIT_BIND");
+        // 接收回复消息
+        byte[] resp = new byte[128];
+        int count = inputStream.read(resp);
+        log.debug("收到服务器回复...长度 {} 字节", count);
+        // 解析消息
+        BindRespStatus status = ClientParseUtil.parseSmitBindRespMessage(resp);
+        if (BindRespStatus.SUCCESS.equals(status)) {
+            connected = true;
+            log.info("服务器连接成功!!!");
+        } else {
+            log.error("服务器连接失败,错误码: {}", status);
+            throw new ConnectFailedException("连接失败,状态码 : " + status);
+        }
+    }
+
+    /*
+     * 关闭连接
+     */
+    @SuppressWarnings("unused")
+    private void close() throws IOException {
+        if (inputStream != null) {
+            inputStream.close();
+            inputStream = null;
+        }
+        if (outputStream != null) {
+            outputStream.close();
+            outputStream = null;
+        }
+        if (socket != null) {
+            socket.close();
+            socket = null;
+        }
+    }
+
+    /*
+     * 停止心跳
+     */
+    private void stopHeartbeat() {
+
+    }
+
+    /*
+     * 开启心跳
+     */
+    private void startHeartbeat() {
+        // 一旦开启需要一直发送
+        while (true) {
+            int count = 1000;
+            
+        }
+    }
+
+    public long getNextSequence() {
+        if (sequenceNumber < 4294967295L) {
+            return sequenceNumber + 1L;
+        } else {
+            return 0L;
+        }
+    }
+
+}

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

@@ -1,25 +0,0 @@
-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 解除黑名单应答
-    
-}

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

@@ -1,113 +0,0 @@
-package com.nokia.sms.blacklist;
-
-import java.nio.ByteBuffer;
-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 org.snmp4j.smi.OctetString;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 构建由客户端发送给服务器的各类消息
- * 
- * 协议参考 河北联通垃圾短信一键解黑接口规范.docx
- * 
- * 这里需要注意一下,规范中是c-octet string 需要在末尾加上 0x00
- */
-@Slf4j
-public class RequestMessageUtil {
-    private static DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
-
-    /**
-     * 协议中SMIT_BIND 绑定请求消息
-     * 
-     * @throws NoSuchAlgorithmException
-     */
-    public static byte[] getSmitBindMessage(String username, String password) throws NoSuchAlgorithmException {
-        // header 4+4+4 body 16+20
-        int messageLength = 48;
-        byte[] message = new byte[messageLength];
-        Arrays.fill(message, (byte) 0);
-        // 填充header
-        // 前4个(0-3)字节是 Unsigned Integer 消息长度
-        message[3] = (byte) messageLength;
-        // 4-7字节是消息类型 Command ID SMIT_BIND 绑定请求为 0x00000001
-        message[7] = (byte) 1;
-        // 8-11字节是消息序列号 从0到0XFFFFFFFF之间 请求的应该从0开始
-
-        // 填充body 16+20
-        // system_id 登录用户id username
-        byte[] byteArraySystemId = new OctetString(username).toByteArray();
-        // 把username的字节复制到message 从12开始到27结束 27位应为0x00
-        // 用户名转化成octet字符串后可能小于16位 因此开始位数应该是 28 - byteArraySystemId.length
-        System.arraycopy(byteArraySystemId, 0, message, 27 - byteArraySystemId.length,
-                byteArraySystemId.length);
-        // authcode 28位开始 共 20位
-        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);
-        log.debug("已完成SMIT_BIND消息组装: {}", Arrays.toString(message));
-        return message;
-    }
-
-    /**
-     * 协议中SMIT_ACTIVE_TEST 链路检测请求 消息
-     */
-    public static byte[] getSmitActiveTestMessage(long messageCount) {
-        // header 4+4+4 body为空
-        int messageLength = 12;
-        byte[] message = new byte[messageLength];
-        Arrays.fill(message, (byte) 0);
-        // 填充header
-        // 前4个(0-3)字节是 Unsigned Integer 消息长度
-        message[3] = (byte) messageLength;
-        // 4-7字节是消息类型 SMIT_ACTIVE_TEST 0x0000000f 链路检测
-        message[7] = (byte) 15;
-        // 8-11字节是消息序列号 从0到0XFFFFFFFF之间 请求的应该从0开始
-        ByteBuffer byteBuffer = ByteBuffer.allocate(8);
-        byteBuffer.putLong(0, messageCount);
-        // java中没有unsigned integer 用long表示以后需要截取后4位byte
-        System.arraycopy(byteBuffer.array(), 4, message, 8, 4);
-        return message;
-    }
-
-    /**
-     * 协议中的 SMIT_DELBLK 0x00000003 解除黑名单请求 消息
-     */
-    public static byte[] getSmitDelblkMessage(long messageCount, String phoneNumber, boolean isMo) {
-        // header 4+4+4 body为21+1+1+1
-        int messageLength = 36;
-        byte[] message = new byte[messageLength];
-        Arrays.fill(message, (byte) 0);
-
-        // 填充header
-        // 前4个(0-3)字节是 Unsigned Integer 消息长度
-        message[3] = (byte) messageLength;
-        // 4-7字节是消息类型 SMIT_DELBLK 0x00000003 解除黑名单请求
-        message[7] = (byte) 3;
-        // 8-11字节是消息序列号 从0到0XFFFFFFFF之间 请求的应该从0开始
-        ByteBuffer byteBuffer = ByteBuffer.allocate(8);
-        byteBuffer.putLong(0, messageCount);
-        // java中没有unsigned integer 用long表示以后需要截取后4位byte
-        System.arraycopy(byteBuffer.array(), 4, message, 8, 4);
-
-        // 填充body
-        // 11-32字节 blk_num 21字节 点对点和网间用户黑名单号码带86,端口用户黑名单号码不带86
-        byte[] blk_num = new OctetString(phoneNumber).toByteArray();
-        System.arraycopy(blk_num, 0, message, 33 - blk_num.length, blk_num.length);
-        // 33字节 blk_type 1 黑名单号码 2 黑名单
-        message[33] = (byte) 1;
-        // 34字节
-        message[34] = (byte) (isMo ? 1 : 2);
-        // 35字节
-        message[35] = (byte) 14;
-        return message;
-    }
-}

+ 0 - 13
src/main/java/com/nokia/sms/blacklist/ResponMessageUtil.java

@@ -1,13 +0,0 @@
-package com.nokia.sms.blacklist;
-
-import java.nio.ByteBuffer;
-
-/**
- * 构建由客户端发送给服务器的各类消息
- * 
- * 协议参考 河北联通垃圾短信一键解黑接口规范.docx
- */
-public class ResponMessageUtil {
-
-    
-}

+ 32 - 1
src/main/java/com/nokia/sms/blacklist/BlacklistTcpClient.java → src/main/java/com/nokia/sms/blacklist/client/BlacklistTcpClient.java

@@ -1,17 +1,22 @@
-package com.nokia.sms.blacklist;
+package com.nokia.sms.blacklist.client;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.Socket;
+import java.security.NoSuchAlgorithmException;
+
+import com.nokia.sms.blacklist.message.ClientMessageUtil;
 
 import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 连接河北联通垃圾短信黑名单系统的socket客户端
  * 
  * 接口协议详见 河北联通垃圾短信一键解黑接口规范.doc
  */
+@Slf4j
 public class BlacklistTcpClient {
     // ip和端口号用户名密码 由 河北联通垃圾短信黑名单系统 提供
     private static String hostIp = "localhost";
@@ -76,7 +81,33 @@ public class BlacklistTcpClient {
     }
 
     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());
+            while (true) {
+                if (socket.isClosed()) {
+                    break;
+                }
+            }
 
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
     }
 
 }

+ 8 - 0
src/main/java/com/nokia/sms/blacklist/exception/ConnectFailedException.java

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

+ 84 - 0
src/main/java/com/nokia/sms/blacklist/message/ClientMessageUtil.java

@@ -0,0 +1,84 @@
+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.Date;
+
+import com.nokia.sms.blacklist.client.BlacklistTcpClient;
+import com.nokia.sms.blacklist.exception.PhoneNumberCanNotBeNullException;
+import com.nokia.sms.blacklist.message.entity.CommandId;
+import com.nokia.sms.blacklist.message.entity.DelBlkBody;
+
+import lombok.Setter;
+
+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 {
+        // 初始化header
+        MessageHeader header = new MessageHeader();
+        // header 12 + body 16+20 所以是48字节
+        header.setMessageLength(48);
+        header.setCommandId(CommandId.SMIT_BIND);
+        // 所有的初始连接需要从0开始
+        header.setSequenceNumber(0L);
+        // 初始化
+        byte[] message = new byte[header.getMessageLength()];
+
+        // 填充header
+        System.arraycopy(header.toByteArray(), 0, message, 0, 12);
+
+        // 填充systemId
+        byte[] systemIdByteArray = client.getSystemId().getBytes();
+        System.arraycopy(systemIdByteArray, 0, message, 12, systemIdByteArray.length);
+
+        // 填充AuthCode
+        String authCodeString = 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;
+    }
+
+    /*
+     * SMIT_DELBLK 0x00000003 解除黑名单请求
+     */
+    public static byte[] getSmitDelBlkMessage(DelBlkBody delBlkBody) 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());
+        // 初始化
+        byte[] message = new byte[header.getMessageLength()];
+        // 填充header
+        System.arraycopy(header.toByteArray(), 0, message, 0, 12);
+
+        // 填充 blk_Num 21字节
+        if (delBlkBody.getBlkNum() == null) {
+            throw new PhoneNumberCanNotBeNullException();
+        }
+        byte[] blkNumByteArray = delBlkBody.getBlkNum().getBytes();
+        System.arraycopy(blkNumByteArray, 0, message, 12, blkNumByteArray.length);
+        // 填充 block_type
+        message[33] = delBlkBody.getBlock_type();
+        message[34] = delBlkBody.getBlk_type();
+        message[35] = delBlkBody.getProvince_code();
+        return message;
+    }
+}

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

@@ -0,0 +1,38 @@
+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;
+    }
+}

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

@@ -37,7 +37,7 @@ public class MessageHeader {
         // commandId
         System.arraycopy(ByteArrayUtil.toByteArray(commandId.value), 4, header, 4, 4);
         // sequenceNumber
-        System.arraycopy(ByteArrayUtil.toByteArray(sequenceNumber), 4, header, 4, 4);
+        System.arraycopy(ByteArrayUtil.toByteArray(sequenceNumber), 4, header, 8, 4);
         return header;
     }
 

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

@@ -0,0 +1,25 @@
+package com.nokia.sms.blacklist.message;
+
+import com.nokia.sms.blacklist.message.entity.BindRespStatus;
+import com.nokia.sms.blacklist.message.entity.CommandId;
+
+public class ServerMessageUtil {
+
+    public static byte[] getSmitBindRespMessage(BindRespStatus status) {
+        // 初始化header
+        MessageHeader header = new MessageHeader();
+        // header 12 + body 1 所以是13字节
+        header.setMessageLength(13);
+        header.setCommandId(CommandId.SMIT_BIND_RESP);
+        // 所有的初始连接需要从0开始
+        header.setSequenceNumber(0L);
+        // 初始化
+        byte[] message = new byte[header.getMessageLength()];
+        // 填充header
+        System.arraycopy(header.toByteArray(), 0, message, 0, 12);
+
+        // 填充status
+        message[12] = status.value;
+        return message;
+    }
+}

+ 6 - 38
src/main/java/com/nokia/sms/blacklist/message/SmitBindMessage.java → src/main/java/com/nokia/sms/blacklist/message/ServerParseUtil.java

@@ -7,57 +7,26 @@ 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;
 import com.nokia.sms.blacklist.message.entity.BindRespStatus;
 import com.nokia.sms.blacklist.message.entity.CommandId;
 
-public class SmitBindMessage {
-    private final MessageHeader header;
-
-    private static BlacklistTcpClient CLIENT;
+public class ServerParseUtil {
 
+    private static final String systemId = "smsTousu";
+    private static final String password = "123456";
     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) {
+    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 (SmitBindMessage.CLIENT.getSystemId().equals(new String(systemIdByteArray).trim())) {
+                if (systemId.equals(new String(systemIdByteArray).trim())) {
                     // 获取和判断鉴权信息
-                    String authCodeString = SmitBindMessage.CLIENT.getPassword() + dateFormat.format(new Date());
+                    String authCodeString = password + dateFormat.format(new Date());
                     MessageDigest digest = MessageDigest.getInstance("SHA-1");
                     // sha1后的本地字符串
                     String authCodeLocal = new String(digest.digest(authCodeString.getBytes()));
@@ -76,5 +45,4 @@ public class SmitBindMessage {
         }
         return BindRespStatus.STRUCTURE_ERROR;
     }
-
 }

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

@@ -1,6 +1,6 @@
 package com.nokia.sms.blacklist.message;
 
-import com.nokia.sms.blacklist.BlacklistTcpClient;
+import com.nokia.sms.blacklist.client.BlacklistTcpClient;
 import com.nokia.sms.blacklist.exception.ParseException;
 import com.nokia.sms.blacklist.message.entity.CommandId;
 

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

@@ -1,6 +1,5 @@
 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;
 
@@ -42,16 +41,4 @@ public class SmitBindRespMessage {
         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;
-    }
 }

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

@@ -1,73 +0,0 @@
-package com.nokia.sms.blacklist.message;
-
-import java.util.Arrays;
-
-import com.nokia.sms.blacklist.BlacklistTcpClient;
-import com.nokia.sms.blacklist.exception.ParseException;
-import com.nokia.sms.blacklist.exception.PhoneNumberCanNotBeNullException;
-import com.nokia.sms.blacklist.message.entity.CommandId;
-import com.nokia.sms.blacklist.message.entity.DelBlkBody;
-
-/*
- * SMIT_DELBLK	0x00000003	解除黑名单请求
- */
-@SuppressWarnings("unused")
-public class SmitDelblkMessage {
-    private final MessageHeader header;
-    private DelBlkBody delBlkBody;
-    private static BlacklistTcpClient CLIENT;
-
-    public SmitDelblkMessage(BlacklistTcpClient client) {
-        // 初始化header
-        header = new MessageHeader();
-        // header 12 + body 21 + 1 + 1 + 1 所以是36字节
-        header.setMessageLength(36);
-        header.setCommandId(CommandId.SMIT_DELBLK);
-        // 从客户端获取下一个序号
-        header.setSequenceNumber(client.getNextSequence());
-        SmitDelblkMessage.CLIENT = client;
-        delBlkBody = new DelBlkBody();
-    }
-
-    public void setBlkNum(String phoneNumber) {
-        delBlkBody.setBlkNum(phoneNumber);
-    }
-
-    public byte[] toByteArray() throws PhoneNumberCanNotBeNullException {
-        // 初始化
-        byte[] message = new byte[header.getMessageLength()];
-        // 填充header
-        System.arraycopy(header.toByteArray(), 0, message, 0, 12);
-
-        // 填充 blk_Num 21字节
-        if (delBlkBody.getBlkNum() == null) {
-            throw new PhoneNumberCanNotBeNullException();
-        }
-        byte[] blkNumByteArray = delBlkBody.getBlkNum().getBytes();
-        System.arraycopy(blkNumByteArray, 0, message, 12, blkNumByteArray.length);
-        // 填充 block_type
-        message[33] = delBlkBody.getBlock_type();
-        message[34] = delBlkBody.getBlk_type();
-        message[35] = delBlkBody.getProvince_code();
-        return message;
-    }
-
-    public DelBlkBody parse(byte[] message) {
-        try {
-            MessageHeader header = MessageHeader.parse(message);
-            // 判断消息类型
-            if (CommandId.SMIT_DELBLK.equals(header.getCommandId())) {
-                DelBlkBody delBlkBody = new DelBlkBody();
-                // blkNum 在 12-33字节
-                delBlkBody.setBlkNum(new String(Arrays.copyOfRange(message, 12, 33)).trim());
-                delBlkBody.setBlock_type(message[33]);
-                delBlkBody.setBlk_type(message[34]);
-                delBlkBody.setProvince_code(message[35]);
-                return delBlkBody;
-            }
-        } catch (ParseException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-}

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

@@ -32,4 +32,9 @@ public enum BindRespStatus {
         }
         return null;
     }
+
+    @Override
+    public String toString() {
+        return name() + ":" + status;
+    }
 }

+ 1 - 0
src/main/java/com/nokia/sms/blacklist/message/entity/DelBlkBody.java

@@ -22,5 +22,6 @@ public class DelBlkBody {
     }
 
     public DelBlkBody() {
+        
     }
 }

+ 1 - 1
src/main/java/com/nokia/sms/blacklist/message/entity/DelBlkRespStatus.java

@@ -5,7 +5,7 @@ package com.nokia.sms.blacklist.message.entity;
  */
 public enum DelBlkRespStatus {
     SUCCESS((byte) 0, "成功"),
-    STRUCTURE_ERROR((byte) 1, "失败");
+    FAILED((byte) 1, "失败");
 
     public final byte value;
     public final String status;

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

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

+ 2 - 1
src/main/java/com/nokia/sms/blacklist/server/ServerSimulation.java

@@ -12,12 +12,13 @@ import lombok.extern.slf4j.Slf4j;
  * 模拟的服务端
  */
 @Slf4j
+@Deprecated
 public class ServerSimulation {
 
     // serverPort
     private static int port = 50000;
 
-    private static int poolSize = 3;
+    private static int poolSize = 1;
     private static ExecutorService pool = Executors.newFixedThreadPool(poolSize);
 
     public static void main(String[] args) {

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

@@ -8,6 +8,7 @@ import java.net.Socket;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
+@Deprecated
 public class ServerSimulationRunnable implements Runnable {
 
     private final Socket socket;

+ 5 - 0
src/main/resources/smsblk.properties

@@ -0,0 +1,5 @@
+blkServer.ipAddress=localhost
+blkServer.port=50000
+
+# 超时设置
+blkServer.connectTimeout=3000

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

@@ -1,26 +0,0 @@
-package com.nokia.sms.blacklist;
-
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-
-import org.junit.jupiter.api.Test;
-
-public class RequestMessageUtilTest {
-    @Test
-    void testGetSmitBindMessage() throws NoSuchAlgorithmException {
-        byte[] message = RequestMessageUtil.getSmitBindMessage("username", "123456");
-        System.out.println(Arrays.toString(message));
-    }
-
-    @Test
-    void testGetSmitAciveTestMessage() {
-        byte[] message = RequestMessageUtil.getSmitActiveTestMessage(2);
-        System.out.println(Arrays.toString(message));
-    }
-
-    @Test
-    void testGetSmitDelblkMessage() {
-        byte[] message = RequestMessageUtil.getSmitDelblkMessage(3, "13231899751", true);
-        System.out.println(Arrays.toString(message));
-    }
-}

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

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