투케이2K

897. (Android/Java) [간단 소스] UDP 소켓 서버 - 실시간 클라이언트 접속 및 메시지 송신 및 수신 확인 : DatagramSocket mSocket 본문

Android

897. (Android/Java) [간단 소스] UDP 소켓 서버 - 실시간 클라이언트 접속 및 메시지 송신 및 수신 확인 : DatagramSocket mSocket

투케이2K 2024. 11. 17. 11:01

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[소스 코드]

 

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Java

- 개발 툴 : Android Studio

- 구분 : 간단 소스

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

    // ------------------------------------------------------------------------------------------
    // TODO [SEARCH FAST] : [클라이언트 접속 확인 및 실시간 메시지 수신 확인]
    // ------------------------------------------------------------------------------------------
    public synchronized void onReceiveMessage(DatagramSocket mSocket) {

        // [로직 처리 수행] : mSocket = new DatagramSocket(port);
        if(mSocket != null) { // TODO [소켓이 널이 아닌 경우]
            
            S_Log._D_(ACTIVITY_NAME + " :: onReceiveMessage :: 클라이언트 접속 및 실시간 메시지 수신 확인 수행", null);

            try {

                mThread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {

                            // TODO [데이터 송수신을 위한 패킷 생성 및 바이트 배열 생성]
                            DatagramPacket inPacket, outPacket;

                            byte[] inMsg = new byte[6144];
                            byte[] outMsg;


                            // TODO [while 클라이언트 접속 상태 체크]
                            while (true) {

                                // --------------------------------------------------------------------

                                // TODO 데이터를 수신하기 위한 패킷 생성
                                inPacket = new DatagramPacket(inMsg, inMsg.length);


                                // TODO 패킷을 통해 데이터를 수신 (receive)
                                mSocket.receive(inPacket);


                                // TODO 수신한 패킷으로 부터 client 의 IP 주소와 Port 획득
                                String address = inPacket.getAddress().getHostAddress(); // 클라이언트 IP
                                int port = inPacket.getPort(); // 클라이언트 PORT

                                String clientMessage = C_Util.getByteToString(inPacket.getData());
                                //String clientMessage = new String(inPacket.getData(), "UTF-8");

                                S_Log._W_(ACTIVITY_NAME + " :: onReceiveMessage :: [클라이언트 >> 서버] :: 전달 받은 메시지 확인", new String[]{
                                        "Client IP :: " + String.valueOf(address),
                                        "Client PORT :: " + String.valueOf(port),
                                        "Client Message :: " + String.valueOf(clientMessage)
                                });

                                // --------------------------------------------------------------------

                                // TODO 클라이언트로 전달 받은 메시지 다시 그대로 전송
                                outMsg = clientMessage.getBytes("UTF-8");


                                // TODO 패킷을 생성해서 client 에게 메시지 전송 (send)
                                outPacket = new DatagramPacket(outMsg, outMsg.length, InetAddress.getByName(address), port);
                                mSocket.send(outPacket);

                                S_Log._W_(ACTIVITY_NAME + " :: onReceiveMessage :: [서버 >> 클라이언트] :: 전송 수행 메시지 확인", new String[]{
                                        String.valueOf(new String(outPacket.getData(), "UTF-8"))
                                });


                                // --------------------------------------------------------------------

                                // TODO [무한 루프 탈출 로직 작성]
                                if (mThread == null || mSocket == null) {
                                    S_Log._E_(ACTIVITY_NAME + " :: onReceiveMessage :: 서버 소켓 접속 체크 종료", new String[]{"설 명 :: 소켓 연결 종료 된 상태 (ServerSocket Is Null)"});

                                    // [소켓 연결 종료]
                                    closeSocket();

                                    // [무한 루프 탈출]
                                    break;
                                }

                                // --------------------------------------------------------------------

                            }

                        } catch (Exception e) {
                            S_Log._printStackTrace_(null, S_FinalData.LOG_BUG_STATE, null, e);

                            // [Exception 발생 시 소켓 연결 종료]
                            closeSocket();
                        }
                    }
                });
                mThread.start(); // [스레드 수행]

            }
            catch (Exception es){
                S_Log._printStackTrace_(null, S_FinalData.LOG_BUG_STATE, null, es);
            }

        }

    }

// -----------------------------------------------------------------------------------

 

반응형
Comments