From a1f4496a8327f3fcfb63a1ec9a64dbaa60491db0 Mon Sep 17 00:00:00 2001 From: jangdongsin Date: Tue, 12 Nov 2024 14:08:23 +0900 Subject: [PATCH] =?UTF-8?q?MMS,=20=EC=B9=B4=EC=B9=B4=EC=98=A4=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=ED=86=A1,=20=EC=B9=9C=EA=B5=AC=ED=86=A1=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EC=B2=98=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/server/task/CollectServerTask.java | 231 ++++++++++++++---- 1 file changed, 185 insertions(+), 46 deletions(-) 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 556de02..30b5def 100644 --- a/src/main/java/com/munjaon/server/server/task/CollectServerTask.java +++ b/src/main/java/com/munjaon/server/server/task/CollectServerTask.java @@ -182,7 +182,7 @@ public class CollectServerTask extends Thread { return false; } - private void recvDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException { + private void recvDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception { /* 서비스 중지여부 체크 */ if (isExpireService()) { expireConnectUser(); @@ -254,7 +254,7 @@ public class CollectServerTask extends Thread { return messageDto; } - private void recvSmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException { + private void recvSmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception { try { ByteBuffer bodyBuffer = ByteBuffer.allocate(SmsMessage.DELIVER_SMS_BODY_LENGTH); channel.read(bodyBuffer); @@ -283,11 +283,12 @@ public class CollectServerTask extends Thread { connectUserDto.updateLastTrafficTime(); } } catch (Exception e) { - e.printStackTrace(); + saveLog(e); + throw e; } } - private void recvLmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException { + private void recvLmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception { try { ByteBuffer bodyBuffer = ByteBuffer.allocate(LmsMessage.DELIVER_LMS_BODY_LENGTH); channel.read(bodyBuffer); @@ -316,11 +317,12 @@ public class CollectServerTask extends Thread { connectUserDto.updateLastTrafficTime(); } } catch (Exception e) { - e.printStackTrace(); + saveLog(e); + throw e; } } - private void recvMmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException { + private void recvMmsDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception { try { long MSG_RECV_TIME = System.currentTimeMillis(); // 메시지를 수신한 시간 ByteBuffer bodyBuffer = ByteBuffer.allocate(MmsMessage.DELIVER_MMS_BODY_LENGTH); @@ -370,7 +372,7 @@ public class CollectServerTask extends Thread { long IMAGE_RECV_TIME = System.currentTimeMillis(); // 이미지 패킷 처리 시작시간 while (true) { int bufferSize = 1024; - if (recvFileSize < fileSize) { + if ((fileSize - recvFileSize) < 1024) { bufferSize = fileSize - recvFileSize; } @@ -384,15 +386,15 @@ public class CollectServerTask extends Thread { } if (recvFileSize == fileSize) { - if (saveFileCount == 0) { + saveFileCount = saveFileCount + 1; // 수신한 파일 카운트 증가 + if (saveFileCount == 1) { messageDto.setUserFileName01(imagePath + File.separator + fileName); - } else if (saveFileCount == 1) { - messageDto.setUserFileName02(imagePath + File.separator + fileName); } else if (saveFileCount == 2) { + messageDto.setUserFileName02(imagePath + File.separator + fileName); + } else if (saveFileCount == 3) { messageDto.setUserFileName03(imagePath + File.separator + fileName); } JobFileFactory.saveFileForByteBuffer(imagePath, fileName, fileBuffer); - saveFileCount++; // 수신한 파일 카운트 증가 break; } @@ -402,40 +404,14 @@ public class CollectServerTask extends Thread { 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 + "]"); -// } + /* 이미지를 모두 수신하지 못한 경우 */ + if (recvFileCount == 0 || (recvFileCount != saveFileCount)) { + saveLog(printTaskLog() + "[MMS File Count : " + recvFileCount + " | saveFileCount : " + saveFileCount + "]"); + expireConnectUser(); + return; + } /* 사용자 단가, 발송망 설정 */ MemberDto savedMemberDto = null; @@ -463,11 +439,94 @@ public class CollectServerTask extends Thread { connectUserDto.updateLastTrafficTime(); } } catch (Exception e) { - e.printStackTrace(); + saveLog(e); + throw e; } } - private void recvKatDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException { + private void recvKatDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception { + try { + ByteBuffer bodyBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_KAKAO_BODY_LENGTH); + channel.read(bodyBuffer); + ByteBuffer deliverBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH + KakaoMessage.DELIVER_KAKAO_BODY_LENGTH); + Packet.mergeBuffers(deliverBuffer, headBuffer, bodyBuffer); + + BasicMessageDto messageDto = recvCommonMessage(deliverBuffer); + messageDto.setUserSubject(KakaoMessage.getSubjectForDeliver(deliverBuffer)); + messageDto.setUserMessage(KakaoMessage.getMessageForDeliver(deliverBuffer)); + messageDto.setKakaoSenderKey(KakaoMessage.getKakaoSenderKeyForDeliver(deliverBuffer)); + messageDto.setKakaoTemplateCode(KakaoMessage.getKakaoTemplateCodeForDeliver(deliverBuffer)); + + String jsonPath = System.getProperty("ROOTPATH") + File.separator + "kakaofile"; + jsonPath = jsonPath + File.separator + MessageUtil.getDate() + File.separator + SerialNoUtil.getSerialNo(); + FileUtil.mkdirs(jsonPath); + + ByteBuffer fileHeadBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_JSON_FILENAME_LENGTH + KakaoMessage.DELIVER_JSON_FILESIZE_LENGTH); + channel.read(fileHeadBuffer); + + String fileName = KakaoMessage.getFileNameForDeliver(fileHeadBuffer); + int fileSize = Integer.parseInt(KakaoMessage.getFileSizeForDeliver(fileHeadBuffer)); + + ByteBuffer fileBuffer = ByteBuffer.allocate(fileSize); + /* 파일 수신 */ + int recvFileSize = 0; + long IMAGE_RECV_TIME = System.currentTimeMillis(); // 파일 패킷 처리 시작시간 + while (true) { + int bufferSize = 1024; + if ((fileSize - recvFileSize) < 1024) { + 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) { + JobFileFactory.saveFileForByteBuffer(jsonPath, fileName, fileBuffer); + messageDto.setKakaoJsonFile(jsonPath + File.separator + fileName); + saveLog(printTaskLog() + "[KAT JSON] [File : " + fileName + ", Size : " + fileSize + "]"); + break; + } + + if (System.currentTimeMillis() - IMAGE_RECV_TIME > 3000) { + /* MMS 이미지 파일 수신 timeout */ + saveLog(printTaskLog() + "[KAKAO File : " + fileName + " : Expired ... ... ... ... ... ... ...]"); + expireConnectUser(); + return; + } + } + + /* 사용자 단가, 발송망 설정 */ + MemberDto savedMemberDto = null; + if (this.connectUserDto != null) { + savedMemberDto = this.connectUserDto.getMemberDto(); + } + if (savedMemberDto != null) { + messageDto.setRouterSeq(savedMemberDto.getKakaoAtAgentCode()); + messageDto.setUnitCost(String.valueOf(savedMemberDto.getKakaoAtPrice())); + } + + saveLog(printTaskLog() + "[MESSAGE : " + messageDto.toString() + "]"); + QueueTypeWorker worker = QueueTypeWorker.find("KAT"); + if (worker != null) { + worker.pushQueue(messageDto); + channel.write(KakaoMessage.makeDeliverAckBuffer(messageDto.getUserMsgID(), messageDto.getSendStatus())); + connectUserDto.updateLastTrafficTime(); + } else { + saveSystemLog("worker is null"); + } + } catch (Exception e) { + saveLog(e); + throw e; + } + } + + private void recvKatDeliver_bak(SocketChannel channel, ByteBuffer headBuffer) throws IOException { try { ByteBuffer bodyBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_KAKAO_BODY_LENGTH); channel.read(bodyBuffer); @@ -522,7 +581,87 @@ public class CollectServerTask extends Thread { } } - private void recvKftDeliver(SocketChannel channel, ByteBuffer headBuffer) throws IOException { + private void recvKftDeliver(SocketChannel channel, ByteBuffer headBuffer) throws Exception { + try { + ByteBuffer bodyBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_KAKAO_BODY_LENGTH); + channel.read(bodyBuffer); + ByteBuffer deliverBuffer = ByteBuffer.allocate(Header.HEADER_LENGTH + KakaoMessage.DELIVER_KAKAO_BODY_LENGTH); + Packet.mergeBuffers(deliverBuffer, headBuffer, bodyBuffer); + + BasicMessageDto messageDto = recvCommonMessage(deliverBuffer); + messageDto.setUserSubject(KakaoMessage.getSubjectForDeliver(deliverBuffer)); + messageDto.setUserMessage(KakaoMessage.getMessageForDeliver(deliverBuffer)); + messageDto.setKakaoSenderKey(KakaoMessage.getKakaoSenderKeyForDeliver(deliverBuffer)); + messageDto.setKakaoTemplateCode(KakaoMessage.getKakaoTemplateCodeForDeliver(deliverBuffer)); + + String jsonPath = System.getProperty("ROOTPATH") + File.separator + "kakaofile"; + jsonPath = jsonPath + File.separator + MessageUtil.getDate() + File.separator + SerialNoUtil.getSerialNo(); + FileUtil.mkdirs(jsonPath); + + ByteBuffer fileHeadBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_JSON_FILENAME_LENGTH + KakaoMessage.DELIVER_JSON_FILESIZE_LENGTH); + channel.read(fileHeadBuffer); + + String fileName = KakaoMessage.getFileNameForDeliver(fileHeadBuffer); + int fileSize = Integer.parseInt(KakaoMessage.getFileSizeForDeliver(fileHeadBuffer)); + + ByteBuffer fileBuffer = ByteBuffer.allocate(fileSize); + /* 파일 수신 */ + int recvFileSize = 0; + long IMAGE_RECV_TIME = System.currentTimeMillis(); // 파일 패킷 처리 시작시간 + while (true) { + int bufferSize = 1024; + if ((fileSize - recvFileSize) < 1024) { + 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) { + JobFileFactory.saveFileForByteBuffer(jsonPath, fileName, fileBuffer); + messageDto.setKakaoJsonFile(jsonPath + File.separator + fileName); + saveLog(printTaskLog() + "[KAT JSON] [File : " + fileName + ", Size : " + fileSize + "]"); + break; + } + + if (System.currentTimeMillis() - IMAGE_RECV_TIME > 3000) { + /* MMS 이미지 파일 수신 timeout */ + saveLog(printTaskLog() + "[KAKAO File : " + fileName + " : Expired ... ... ... ... ... ... ...]"); + expireConnectUser(); + return; + } + } + + /* 사용자 단가, 발송망 설정 */ + MemberDto savedMemberDto = null; + if (this.connectUserDto != null) { + savedMemberDto = this.connectUserDto.getMemberDto(); + } + if (savedMemberDto != null) { + messageDto.setRouterSeq(savedMemberDto.getKakaoFtAgentCode()); + messageDto.setUnitCost(String.valueOf(savedMemberDto.getKakaoFtPrice())); + } + + saveLog(printTaskLog() + "[MESSAGE : " + messageDto.toString() + "]"); + QueueTypeWorker worker = QueueTypeWorker.find("KFT"); + if (worker != null) { + worker.pushQueue(messageDto); + channel.write(KakaoMessage.makeDeliverAckBuffer(messageDto.getUserMsgID(), messageDto.getSendStatus())); + connectUserDto.updateLastTrafficTime(); + } + } catch (Exception e) { + saveLog(e); + throw e; + } + } + + private void recvKftDeliver_bak(SocketChannel channel, ByteBuffer headBuffer) throws IOException { try { ByteBuffer bodyBuffer = ByteBuffer.allocate(KakaoMessage.DELIVER_KAKAO_BODY_LENGTH); channel.read(bodyBuffer);