Notice
Recent Posts
Recent Comments
Link
투케이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);
}
}
}
// -----------------------------------------------------------------------------------
반응형
'Android' 카테고리의 다른 글
Comments