장동신 장동신 2024-11-11
개발서버 정보 수정, mms 이미지 처리 로직 수정
@b4d1a37cadd908db907b831bdc5e488650b4477e
src/main/java/com/munjaon/server/server/packet/common/Packet.java
--- src/main/java/com/munjaon/server/server/packet/common/Packet.java
+++ src/main/java/com/munjaon/server/server/packet/common/Packet.java
@@ -61,6 +61,16 @@
         }
     }
 
+    public static void mergeBuffers(ByteBuffer dest, ByteBuffer src, int destOffset) {
+        if (dest == null || src == null) {
+            return;
+        }
+
+        for (int i = 0; i < src.capacity(); i++) {
+            dest.put((destOffset + i), src.get(i));
+        }
+    }
+
     public static void printBuffer(ByteBuffer buffer) {
         if (buffer == null) {
             return;
src/main/java/com/munjaon/server/server/task/CollectServerTask.java
--- src/main/java/com/munjaon/server/server/task/CollectServerTask.java
+++ src/main/java/com/munjaon/server/server/task/CollectServerTask.java
@@ -322,6 +322,7 @@
 
     private void recvMmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException {
         try {
+            long MSG_RECV_TIME = System.currentTimeMillis();    // 메시지를 수신한 시간
             ByteBuffer bodyBuffer = ByteBuffer.allocate(MmsMessage.DELIVER_MMS_BODY_LENGTH);
             channel.read(bodyBuffer);
             ByteBuffer deliverBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH + MmsMessage.DELIVER_MMS_BODY_LENGTH);
@@ -341,24 +342,100 @@
             imagePath = imagePath + File.separator + MessageUtil.getDate() + File.separator + SerialNoUtil.getSerialNo();
             FileUtil.mkdirs(imagePath);
 
-            for (int i = 0; i < recvFileCount; i++) {
-                ByteBuffer fileHeadBuffer = ByteBuffer.allocate(MmsMessage.DELIVER_MMS_FILENAME_LENGTH + MmsMessage.DELIVER_MMS_FILESIZE_LENGTH);
-                channel.read(fileHeadBuffer);
-                String fileName = MmsMessage.getFileNameForDeliver(fileHeadBuffer);
-                String fileSize = MmsMessage.getFileSizeForDeliver(fileHeadBuffer);
-                ByteBuffer fileBuffer = ByteBuffer.allocate(Integer.parseInt(fileSize));
-                channel.read(fileBuffer);
-                fileBuffer.flip();
-                JobFileFactory.saveFileForByteBuffer(imagePath, fileName, fileBuffer);
-                if (i == 0) {
-                    messageDto.setUserFileName01(imagePath + File.separator + fileName);
-                } else if (i == 1) {
-                    messageDto.setUserFileName02(imagePath + File.separator + fileName);
-                } else if (i == 2) {
-                    messageDto.setUserFileName03(imagePath + File.separator + fileName);
+            int saveFileCount = 0;
+            while (true) {
+                if (recvFileCount == saveFileCount) {   // 이미지 파일을 모두 수신한 경우
+                    break;
                 }
-                saveLog(printTaskLog() + "[MMS IMAGE] [File : " + fileName + ", Size : " + fileSize + "]");
+                if (System.currentTimeMillis() - MSG_RECV_TIME > 10000) {
+                    /* MMS 파일 수신 timeout */
+                    saveLog(printTaskLog() + "[MMS File TimeOut : Expired ... ... ... ... ... ... ...]");
+                    expireConnectUser();
+                    return;
+                }
+                /* MMS 파일 수신 */
+                ByteBuffer fileHeadBuffer = ByteBuffer.allocate(MmsMessage.DELIVER_MMS_FILENAME_LENGTH + MmsMessage.DELIVER_MMS_FILESIZE_LENGTH);
+                int recvCount = channel.read(fileHeadBuffer);
+                if (recvCount == 0) {   // 수신한 바이트가 없거나 끊긴 경우
+                    continue;
+                }
+
+                /* 이미지 파일 패킷 수진 */
+                String fileName = MmsMessage.getFileNameForDeliver(fileHeadBuffer);
+                int fileSize = Integer.parseInt(MmsMessage.getFileSizeForDeliver(fileHeadBuffer));
+                saveLog("[MMS File Name : " + fileName + ", File Size : " + fileSize + "]");
+
+                int recvFileSize = 0;
+                ByteBuffer fileBuffer = ByteBuffer.allocate(fileSize);
+                long IMAGE_RECV_TIME = System.currentTimeMillis();    // 이미지 패킷 처리 시작시간
+                while (true) {
+                    int bufferSize = 1024;
+                    if (recvFileSize < fileSize) {
+                        bufferSize = fileSize - recvFileSize;
+                    }
+
+                    ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
+                    int unitRecvCnt = channel.read(buffer);
+                    if (unitRecvCnt > 0) {
+                        Packet.mergeBuffers(fileBuffer, buffer, recvFileSize);
+                        recvFileSize += unitRecvCnt;
+                        saveLog("unitRecvCnt : " + unitRecvCnt);
+                        saveLog("recvFileSize : " + recvFileSize);
+                    }
+
+                    if (recvFileSize == fileSize) {
+                        if (saveFileCount == 0) {
+                            messageDto.setUserFileName01(imagePath + File.separator + fileName);
+                        } else if (saveFileCount == 1) {
+                            messageDto.setUserFileName02(imagePath + File.separator + fileName);
+                        } else if (saveFileCount == 2) {
+                            messageDto.setUserFileName03(imagePath + File.separator + fileName);
+                        }
+                        JobFileFactory.saveFileForByteBuffer(imagePath, fileName, fileBuffer);
+                        saveFileCount++;    // 수신한 파일 카운트 증가
+                        break;
+                    }
+
+                    if (System.currentTimeMillis() - IMAGE_RECV_TIME > 3000) {
+                        /* MMS 이미지 파일 수신 timeout */
+                        saveLog(printTaskLog() + "[MMS File : " + fileName + " : Expired ... ... ... ... ... ... ...]");
+                        break;
+                    }
+                }
+//                ByteBuffer fileBuffer = ByteBuffer.allocate(Integer.parseInt(fileSize));
+//                channel.read(fileBuffer);
+//                saveSystemLog("fileBuffer Last : " + fileBuffer.get(fileBuffer.capacity() - 1));
+//                fileBuffer.flip();
+//                JobFileFactory.saveFileForByteBuffer(imagePath, fileName, fileBuffer);
+//                if (saveFileCount == 0) {
+//                    messageDto.setUserFileName01(imagePath + File.separator + fileName);
+//                } else if (saveFileCount == 1) {
+//                    messageDto.setUserFileName02(imagePath + File.separator + fileName);
+//                } else if (saveFileCount == 2) {
+//                    messageDto.setUserFileName03(imagePath + File.separator + fileName);
+//                }
+//                saveLog(printTaskLog() + "[MMS IMAGE] [File : " + fileName + ", Size : " + fileSize + "]");
+//                saveFileCount++;    // 수신한 파일 카운트 증가
             }
+
+//            for (int i = 0; i < recvFileCount; i++) {
+//                ByteBuffer fileHeadBuffer = ByteBuffer.allocate(MmsMessage.DELIVER_MMS_FILENAME_LENGTH + MmsMessage.DELIVER_MMS_FILESIZE_LENGTH);
+//                channel.read(fileHeadBuffer);
+//                String fileName = MmsMessage.getFileNameForDeliver(fileHeadBuffer);
+//                String fileSize = MmsMessage.getFileSizeForDeliver(fileHeadBuffer);
+//                ByteBuffer fileBuffer = ByteBuffer.allocate(Integer.parseInt(fileSize));
+//                channel.read(fileBuffer);
+//                fileBuffer.flip();
+//                JobFileFactory.saveFileForByteBuffer(imagePath, fileName, fileBuffer);
+//                if (i == 0) {
+//                    messageDto.setUserFileName01(imagePath + File.separator + fileName);
+//                } else if (i == 1) {
+//                    messageDto.setUserFileName02(imagePath + File.separator + fileName);
+//                } else if (i == 2) {
+//                    messageDto.setUserFileName03(imagePath + File.separator + fileName);
+//                }
+//                saveLog(printTaskLog() + "[MMS IMAGE] [File : " + fileName + ", Size : " + fileSize + "]");
+//            }
 
             /* 사용자 단가, 발송망 설정 */
             MemberDto savedMemberDto = null;
@@ -564,6 +641,7 @@
             }
         } catch (Exception e) {
             resultCode = "10";
+            saveLog(e);
             e.printStackTrace();
         }
 
src/main/resources/application-dev.yml
--- src/main/resources/application-dev.yml
+++ src/main/resources/application-dev.yml
@@ -2,10 +2,10 @@
   datasource:
     server:
       driver-class-name: org.mariadb.jdbc.Driver
-      url: jdbc:mariadb://localhost:3306/mjon
-      jdbc-url: jdbc:mariadb://localhost:3306/mjon
-      username: root
-      password: 1234
+      url: jdbc:mariadb://192.168.0.60:3303/mjon_agent_server
+      jdbc-url: jdbc:mariadb://192.168.0.60:3303/mjon_agent_server
+      username: mjonUr_agent
+      password: mjagent123$
       connectionTimeout: 30000
       maximumPoolSize: 15
       maxLifetime: 1800000
@@ -22,6 +22,6 @@
 #  server-property-file: /home/mjon_server_agent/config/server.properties
 #  db-name: mjon_agent_back
 agent:
-  root-path: /Users/jangdongsin/DevDocs/apps/itn/agent_server
-  server-property-file: /Users/jangdongsin/DevDocs/apps/itn/agent_server/config/server.properties
+  root-path: /data/agent/agent_server
+  server-property-file: /data/agent/agent_server/config/server.properties
   db-name: mjon_agent_back
(No newline at end of file)
Add a comment
List