Ver Fonte

feat: 短信解黑服务端改造

weijianghai há 2 anos atrás
pai
commit
05ca85f8a5

+ 3 - 0
sms_blk_api/build-dir/run.sh

@@ -0,0 +1,3 @@
+#!/bin/bash
+
+nohup java -jar /data1/sms_blk/sms_blk_api/sms_blk_api-exec.jar >/dev/null 2>&1 &

+ 5 - 0
sms_blk_api/build-dir/stop.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+for i in $(ps -ef | grep sms_blk_api-exec.jar | grep -v grep | awk '{print $2}'); do
+  kill -9 "$i"
+done

+ 11 - 2
sms_blk_api/src/main/java/com/nokia/sms/SmsBlkApiApplication.java

@@ -1,12 +1,21 @@
 package com.nokia.sms;
 
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.core.env.Environment;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+@Slf4j
 @SpringBootApplication
 public class SmsBlkApiApplication {
 
-    public static void main(String[] args) {
-        SpringApplication.run(SmsBlkApiApplication.class, args);
+    public static void main(String[] args) throws UnknownHostException {
+        SpringApplication app = new SpringApplication(SmsBlkApiApplication.class);
+        Environment env = app.run(args).getEnvironment();
+        log.info("╭( ′• o •′ )╭☞ run on http://{}:{}", InetAddress.getLocalHost().getHostAddress(),
+                env.getProperty("server.port"));
     }
 }

+ 5 - 5
sms_blk_api/src/main/java/com/nokia/sms/config/ControllerExceptionHandler.java

@@ -24,7 +24,7 @@ public class ControllerExceptionHandler
     public ResponseEntity<Object> httpMessageNotReadableExceptionValidatorHandler(HttpMessageNotReadableException e)
     {
         log.warn("╭( ′• o •′ )╭☞ 请求参数校验未通过: {}", e.getMessage());
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error(e.getMessage()));
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error().message(e.getMessage()));
     }
 
     @ExceptionHandler(BindException.class)
@@ -37,7 +37,7 @@ public class ControllerExceptionHandler
             message = fieldError.getDefaultMessage();
             log.warn("╭( ′• o •′ )╭☞ 请求参数校验未通过: {}", message);
         }
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error(message));
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error().message(message));
     }
 
     @ExceptionHandler(ConstraintViolationException.class)
@@ -45,7 +45,7 @@ public class ControllerExceptionHandler
     {
         String message = e.getConstraintViolations().iterator().next().getMessage();
         log.warn("╭( ′• o •′ )╭☞ 请求参数校验未通过: {}", message);
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error(message));
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error().message(message));
     }
 
     @ExceptionHandler(MethodArgumentNotValidException.class)
@@ -58,11 +58,11 @@ public class ControllerExceptionHandler
             message = fieldError.getDefaultMessage();
             log.warn("╭( ′• o •′ )╭☞ 请求参数校验未通过: {}", message);
         }
-        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error(message));
+        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error().message(message));
     }
     
     @ExceptionHandler({Exception.class})
-    public ResponseEntity<R> exceptionHandler(Exception e)
+    public ResponseEntity<Object> exceptionHandler(Exception e)
     {
         log.error("╭( ′• o •′ )╭☞ 发生错误了 {}", e.getMessage(), e);
         return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(R.error());

+ 4 - 2
sms_blk_api/src/main/java/com/nokia/sms/config/LogAspectConfig.java

@@ -8,6 +8,7 @@ import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Before;
 import org.aspectj.lang.annotation.Pointcut;
+import org.slf4j.MDC;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StopWatch;
@@ -20,11 +21,11 @@ import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 
 /**
  * 日志配置
  *
- * @author weijianghai
  */
 @Aspect
 @Component
@@ -96,9 +97,10 @@ public class LogAspectConfig
     {
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();
+        MDC.put("traceId", UUID.randomUUID().toString().replace("-", ""));
         Object result = proceedingJoinPoint.proceed();
-        log.info("返回: {}", JSON.toJSONString(result));
         stopWatch.stop();
+        log.info("返回: {}", JSON.toJSONString(result));
         log.info("耗时:{} ms", stopWatch.getTotalTimeMillis());
         return result;
     }

+ 1 - 1
sms_blk_api/src/main/java/com/nokia/sms/service/SocketClientService.java

@@ -47,7 +47,7 @@ public class SocketClientService {
 
     public SocketClientService(ThreadPoolTaskScheduler socketScheduler) throws ConnectFailedException {
         this.socketScheduler = socketScheduler;
-        // connect();
+//        connect();
     }
 
     /*

+ 51 - 0
sms_blk_api/src/main/resources/logback-spring.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <property name="PATH" value="./log"/>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <Pattern>%d{HH:mm:ss.SSS} %highlight(%-5level) %yellow(%X{traceId}) %magenta([%thread]) %cyan(%logger:%line) %msg%n</Pattern>
+        </encoder>
+    </appender>
+    <appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${PATH}/trace.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!-- rollover daily -->
+            <fileNamePattern>${PATH}/trace.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
+            <maxFileSize>10MB</maxFileSize>
+            <maxHistory>60</maxHistory>
+            <totalSizeCap>20GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <Pattern>%d %highlight(%-5level) %yellow(%X{traceId}) %magenta([%thread]) %cyan(%logger:%line) %msg%n</Pattern>
+        </encoder>
+    </appender>
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${PATH}/error.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!-- rollover daily -->
+            <fileNamePattern>${PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
+            <maxFileSize>10MB</maxFileSize>
+            <maxHistory>60</maxHistory>
+            <totalSizeCap>20GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <Pattern>%d %highlight(%-5level) %yellow(%X{traceId}) %magenta([%thread]) %cyan(%logger:%line) %msg%n</Pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+    <root level="INFO">
+        <appender-ref ref="STDOUT"/>
+    </root>
+    <root level="TRACE">
+        <appender-ref ref="TRACE_FILE"/>
+    </root>
+    <root level="ERROR">
+        <appender-ref ref="ERROR_FILE"/>
+    </root>
+</configuration>

+ 2 - 1
sms_blk_api/src/main/resources/smsblk.properties

@@ -1,3 +1,4 @@
+#blkServer.ipAddress=127.0.0.1
 blkServer.ipAddress=10.17.182.24
 blkServer.port=50000
 # 账号/密码:sass2/HCdqs!23 sass2/gFdqsD13
@@ -6,4 +7,4 @@ blkServer.password=gFdqsD13
 blkServer.heartbeatDelay=15000
 
 # 超时设置
-blkServer.connectTimeout=3000
+blkServer.connectTimeout=3000

+ 11 - 2
sms_blk_interface/src/main/java/com/nokia/sms/SmsBlkInterfaceApplication.java

@@ -1,12 +1,21 @@
 package com.nokia.sms;
 
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.core.env.Environment;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+@Slf4j
 @SpringBootApplication
 public class SmsBlkInterfaceApplication {
 
-    public static void main(String[] args) {
-        SpringApplication.run(SmsBlkInterfaceApplication.class, args);
+    public static void main(String[] args) throws UnknownHostException {
+        SpringApplication app = new SpringApplication(SmsBlkInterfaceApplication.class);
+        Environment env = app.run(args).getEnvironment();
+        log.info("╭( ′• o •′ )╭☞ run on http://{}:{}", InetAddress.getLocalHost().getHostAddress(),
+                env.getProperty("server.port"));
     }
 }

+ 3 - 3
sms_blk_interface/src/main/resources/logback-spring.xml

@@ -3,7 +3,7 @@
     <property name="PATH" value="./log"/>
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
-            <Pattern>%d{HH:mm:ss.SSS} %highlight(%-5level) %yellow(%X{traceId}) %cyan(%logger:%line) %msg%n</Pattern>
+            <Pattern>%d{HH:mm:ss.SSS} %highlight(%-5level) %yellow(%X{traceId}) %magenta([%thread]) %cyan(%logger:%line) %msg%n</Pattern>
         </encoder>
     </appender>
     <appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -17,7 +17,7 @@
             <totalSizeCap>20GB</totalSizeCap>
         </rollingPolicy>
         <encoder>
-            <Pattern>%d %highlight(%-5level) %yellow(%X{traceId}) %cyan(%logger:%line) %msg%n</Pattern>
+            <Pattern>%d %highlight(%-5level) %yellow(%X{traceId}) %magenta([%thread]) %cyan(%logger:%line) %msg%n</Pattern>
         </encoder>
     </appender>
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -31,7 +31,7 @@
             <totalSizeCap>20GB</totalSizeCap>
         </rollingPolicy>
         <encoder>
-            <Pattern>%d %highlight(%-5level) %yellow(%X{traceId}) %cyan(%logger:%line) %msg%n</Pattern>
+            <Pattern>%d %highlight(%-5level) %yellow(%X{traceId}) %magenta([%thread]) %cyan(%logger:%line) %msg%n</Pattern>
         </encoder>
         <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>ERROR</level>

+ 27 - 2
sms_blk_interface/src/test/java/com/nokia/sms/SyncTest.java

@@ -182,7 +182,7 @@ class SyncTest {
                     Map<String, String> v2 = m2.getOrDefault(phone, new HashMap<>());
                     String flag = "是";
                     String diff = "";
-                    String situation = "";
+                    String situation = "没有同步记录但是在黑数据中存在";
                     if (!v1.get("reason").equals(v2.get("reason"))) {
                         diff = "入黑名单原因、";
                     }
@@ -363,7 +363,7 @@ class SyncTest {
     @Test
     void testUpdate() {
         Set<String> notExists = new HashSet<>();
-        try (CsvReader csvReader = CsvReader.builder().build(Paths.get(TEST_DIR + "data.csv"), StandardCharsets.UTF_8)) {
+        try (CsvReader csvReader = CsvReader.builder().build(Paths.get(TEST_DIR + "data1.csv"), StandardCharsets.UTF_8)) {
             for (CsvRow row : csvReader) {
                 log.info("{} row: {}", row.getOriginalLineNumber(), row.getFields());
                 if (!StringUtils.hasText(row.getField(0))) {
@@ -400,4 +400,29 @@ class SyncTest {
             e.printStackTrace();
         }
     }
+
+    @Test
+    void testTrimAllWhitespace() {
+        String d1 = TEST_DIR + "data.csv";
+        String d2 = TEST_DIR + "dataa.csv";
+        try (CsvReader csvReader = CsvReader.builder().build(Paths.get(d1), StandardCharsets.UTF_8);
+             OutputStreamWriter osw1 = new OutputStreamWriter(Files.newOutputStream(Paths.get(d2)), StandardCharsets.UTF_8);
+             CsvWriter csvWriter1 = CsvWriter.builder().build(osw1);
+        ) {
+            for (CsvRow row : csvReader) {
+                if (!StringUtils.hasText(row.getField(0))) {
+                    log.warn("跳过空行");
+                    continue;
+                }
+                String phone = StringUtils.trimAllWhitespace(row.getField(0));
+                String reason = StringUtils.trimAllWhitespace(row.getField(1));
+                String startTime = StringUtils.trimAllWhitespace(row.getField(2));
+                String endTime = StringUtils.trimAllWhitespace(row.getField(3));
+                String suggestion = StringUtils.trimAllWhitespace(row.getField(4));
+                csvWriter1.writeRow(phone, reason, startTime, endTime, suggestion);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }

+ 3 - 0
sms_blk_server/build-dir/run.sh

@@ -0,0 +1,3 @@
+#!/bin/bash
+
+nohup java -jar /data1/sms_blk/sms_blk_server/sms_blk_server-exec.jar >/dev/null 2>&1 &

+ 5 - 0
sms_blk_server/build-dir/stop.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+for i in $(ps -ef | grep sms_blk_server-exec.jar | grep -v grep | awk '{print $2}'); do
+  kill -9 "$i"
+done

+ 13 - 0
sms_blk_server/pom.xml

@@ -30,4 +30,17 @@
         </dependency>
     </dependencies>
 
+    <build>
+        <finalName>sms_blk_server</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <!-- 打包1个带exec的可执行jar包和一个不带exec的可作为依赖的jar包 -->
+                    <classifier>exec</classifier>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>

+ 96 - 97
sms_blk_server/src/main/java/com/nokia/sms/BlkDelServer.java

@@ -1,97 +1,96 @@
-package com.nokia.sms;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-import com.nokia.sms.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();
-            }
-        }
-    }
-}
+//package com.nokia.sms;
+//
+//import com.nokia.sms.message.ServerMessageUtil;
+//import lombok.extern.slf4j.Slf4j;
+//
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.io.OutputStream;
+//import java.net.ServerSocket;
+//import java.net.Socket;
+//
+///*
+// * 模拟服务器
+// */
+//@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[38];
+//    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();
+//            }
+//        }
+//    }
+//}

+ 21 - 0
sms_blk_server/src/main/java/com/nokia/sms/SmsBlkServerApplication.java

@@ -0,0 +1,21 @@
+package com.nokia.sms;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.core.env.Environment;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+@Slf4j
+@SpringBootApplication
+public class SmsBlkServerApplication {
+
+    public static void main(String[] args) throws UnknownHostException {
+        SpringApplication app = new SpringApplication(SmsBlkServerApplication.class);
+        Environment env = app.run(args).getEnvironment();
+        log.info("╭( ′• o •′ )╭☞ run on http://{}:{}", InetAddress.getLocalHost().getHostAddress(),
+                env.getProperty("server.port"));
+    }
+}

+ 28 - 0
sms_blk_server/src/main/java/com/nokia/sms/config/ExecutorConfig.java

@@ -0,0 +1,28 @@
+package com.nokia.sms.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * socket线程池配置
+ */
+@Slf4j
+@Configuration
+public class ExecutorConfig {
+    public static final int CORE_POOL_SIZE = 1;
+    public static final int MAXIMUM_POOL_SIZE = 1;
+
+    @Bean
+    public ThreadPoolExecutor executor() {
+        return new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, 0L,
+                TimeUnit.MILLISECONDS,
+                new LinkedBlockingQueue<>(),
+                new CustomizableThreadFactory("socket-"));
+    }
+}

+ 90 - 0
sms_blk_server/src/main/java/com/nokia/sms/config/SocketRunner.java

@@ -0,0 +1,90 @@
+package com.nokia.sms.config;
+
+import com.nokia.sms.message.ServerMessageUtil;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * socket服务端
+ */
+@Slf4j
+@Component
+public class SocketRunner implements CommandLineRunner {
+    private static final int PORT = 50000;
+    @Autowired
+    private ThreadPoolExecutor executor;
+
+    @Override
+    public void run(String... args) {
+        CompletableFuture.runAsync(new ServerTask());
+    }
+
+    /**
+     * 启动socket服务端
+     */
+    public void runServer() {
+        try (ServerSocket server = new ServerSocket(PORT)) {
+            log.info("socket服务端已在端口 {} 启动", PORT);
+            while (!server.isClosed()) {
+                if (executor.getActiveCount() < executor.getCorePoolSize()) {
+                    executor.submit(new AcceptTask(server));
+                }
+            }
+        } catch (Exception e) {
+            log.error("socket server error:{}", e.getMessage(), e);
+            runServer();
+        }
+    }
+
+    /**
+     * 接收socket连接
+     */
+    public void accept(ServerSocket server) {
+        log.info("socket accept");
+        try (Socket socket = server.accept();
+             OutputStream outputStream = socket.getOutputStream();
+             InputStream inputStream = socket.getInputStream()) {
+            while (socket.isConnected()) {
+                byte[] buffer = new byte[38];
+                // 先读取客户端的输入
+                int readCount = inputStream.read(buffer);
+                log.info("收到来自 {} 的 {} 字节数据: {}", socket.getRemoteSocketAddress(), readCount, buffer);
+                // 识别消息 并建立 应返回的消息
+                byte[] message = ServerMessageUtil.parse(buffer);
+                // 向客户端输出
+                outputStream.write(message);
+                outputStream.flush();
+            }
+        } catch (IOException e) {
+            log.error("socket accept error: {}", e.getMessage(), e);
+        }
+    }
+
+    @AllArgsConstructor
+    class AcceptTask implements Runnable {
+        private ServerSocket server;
+
+        @Override
+        public void run() {
+            accept(server);
+        }
+    }
+
+    class ServerTask implements Runnable {
+        @Override
+        public void run() {
+            runServer();
+        }
+    }
+}

+ 16 - 18
sms_blk_server/src/main/java/com/nokia/sms/message/ServerMessageUtil.java

@@ -1,5 +1,10 @@
 package com.nokia.sms.message;
 
+import com.nokia.sms.entity.BindRespStatus;
+import com.nokia.sms.entity.CommandId;
+import com.nokia.sms.exception.ParseException;
+import lombok.extern.slf4j.Slf4j;
+
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.text.DateFormat;
@@ -7,17 +12,11 @@ import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Date;
 
-import com.nokia.sms.entity.BindRespStatus;
-import com.nokia.sms.entity.CommandId;
-import com.nokia.sms.exception.ParseException;
-
-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");
+    private static final String SYSTEM_ID = "sass2";
+    private static final String PASSWORD = "gFdqsD13";
+    private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");
 
     /*
      * SMIT_BIND_RESP 0x80000001 绑定应答
@@ -84,7 +83,7 @@ public class ServerMessageUtil {
     public static byte[] parse(byte[] message) {
         try {
             MessageHeader header = MessageHeader.parse(message);
-            log.debug("消息被服务端解析为 {} 消息, 序列号 {}", header.getCommandId(), header.getSequenceNumber());
+            log.info("消息被服务端解析为 {} 消息, 序列号 {}", header.getCommandId(), header.getSequenceNumber());
             // 判断消息类型
             switch (header.getCommandId()) {
                 case SMIT_ACTIVE_TEST:
@@ -102,7 +101,7 @@ public class ServerMessageUtil {
         } catch (ParseException e) {
             e.printStackTrace();
         }
-        return null;
+        return new byte[0];
     }
 
     /*
@@ -114,24 +113,23 @@ public class ServerMessageUtil {
             // 判断消息类型
             if (CommandId.SMIT_BIND.equals(header.getCommandId())) {
                 // 获取并对比systemId
-                byte[] systemIdByteArray = Arrays.copyOfRange(message, 12, 28);
-                if (systemId.equals(new String(systemIdByteArray).trim())) {
+                byte[] systemIdByteArray = Arrays.copyOfRange(message, 12, 18);
+                String systemIdStr = new String(systemIdByteArray).trim();
+                if (SYSTEM_ID.equals(systemIdStr)) {
                     // 获取和判断鉴权信息
-                    String authCodeString = password + dateFormat.format(new Date());
+                    String authCodeString = PASSWORD + DATE_FORMAT.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));
+                    String authCode = new String(Arrays.copyOfRange(message, 18, 38));
                     if (authCodeLocal.equals(authCode)) {
                         return BindRespStatus.SUCCESS;
                     }
                 }
                 return BindRespStatus.AUTH_ERROR;
             }
-        } catch (ParseException e) {
-            e.printStackTrace();
-        } catch (NoSuchAlgorithmException e) {
+        } catch (ParseException | NoSuchAlgorithmException e) {
             e.printStackTrace();
         }
         return BindRespStatus.STRUCTURE_ERROR;

+ 2 - 0
sms_blk_server/src/main/resources/application.properties

@@ -0,0 +1,2 @@
+server.port=12122
+logging.level.root=info

+ 51 - 0
sms_blk_server/src/main/resources/logback-spring.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <property name="PATH" value="./log"/>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <Pattern>%d{HH:mm:ss.SSS} %highlight(%-5level) %yellow(%X{traceId}) %magenta([%thread]) %cyan(%logger:%line) %msg%n</Pattern>
+        </encoder>
+    </appender>
+    <appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${PATH}/trace.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!-- rollover daily -->
+            <fileNamePattern>${PATH}/trace.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
+            <maxFileSize>10MB</maxFileSize>
+            <maxHistory>60</maxHistory>
+            <totalSizeCap>20GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <Pattern>%d %highlight(%-5level) %yellow(%X{traceId}) %magenta([%thread]) %cyan(%logger:%line) %msg%n</Pattern>
+        </encoder>
+    </appender>
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${PATH}/error.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!-- rollover daily -->
+            <fileNamePattern>${PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
+            <maxFileSize>10MB</maxFileSize>
+            <maxHistory>60</maxHistory>
+            <totalSizeCap>20GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <Pattern>%d %highlight(%-5level) %yellow(%X{traceId}) %magenta([%thread]) %cyan(%logger:%line) %msg%n</Pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+    <root level="INFO">
+        <appender-ref ref="STDOUT"/>
+    </root>
+    <root level="TRACE">
+        <appender-ref ref="TRACE_FILE"/>
+    </root>
+    <root level="ERROR">
+        <appender-ref ref="ERROR_FILE"/>
+    </root>
+</configuration>