diff --git a/src/main/java/com/munjaon/server/server/packet/common/Packet.java b/src/main/java/com/munjaon/server/server/packet/common/Packet.java index 3f176b7..520c196 100644 --- a/src/main/java/com/munjaon/server/server/packet/common/Packet.java +++ b/src/main/java/com/munjaon/server/server/packet/common/Packet.java @@ -61,6 +61,16 @@ public final class Packet { } } + 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; diff --git a/src/main/java/com/munjaon/server/server/task/CollectServerTask.java b/src/main/java/com/munjaon/server/server/task/CollectServerTask.java index 6d6ba76..556de02 100644 --- a/src/main/java/com/munjaon/server/server/task/CollectServerTask.java +++ b/src/main/java/com/munjaon/server/server/task/CollectServerTask.java @@ -322,6 +322,7 @@ public class CollectServerTask extends Thread { 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,25 +342,101 @@ public class CollectServerTask extends Thread { 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; if (this.connectUserDto != null) { @@ -564,6 +641,7 @@ public class CollectServerTask extends Thread { } } catch (Exception e) { resultCode = "10"; + saveLog(e); e.printStackTrace(); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index c22c5b4..8dd9a50 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -2,10 +2,10 @@ spring: 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: # 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