Notice
Recent Posts
Recent Comments
Link
투케이2K
143. (TWOK/UTIL) [Android/Java] C_Udp_Client_Socket_Module : UDP 클라이언트 소켓 모듈 - UDP Client Socket 본문
투케이2K 유틸파일
143. (TWOK/UTIL) [Android/Java] C_Udp_Client_Socket_Module : UDP 클라이언트 소켓 모듈 - UDP Client Socket
투케이2K 2024. 11. 15. 20:21[설 명]
프로그램 : Android / Java
설 명 : C_Udp_Client_Socket_Module : UDP 클라이언트 소켓 모듈 - UDP Client Socket
[소스 코드]
package com.example.javaproject.C_Module;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import com.example.javaproject.C_StateCheck;
import com.example.javaproject.S_FinalData;
import com.example.javaproject.S_Log;
import org.json.JSONObject;
import java.io.DataInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
public class C_Udp_Client_Socket_Module {
/**
* // --------------------------------------------------------------------------------------
* TODO [클래스 설명]
* // --------------------------------------------------------------------------------------
* 1. [설명] : UDP 통신 수행 클래스
* // --------------------------------------------------------------------------------------
* */
/**
* // --------------------------------------------------------------------------------------
* TODO [빠른 로직 찾기 : 주석 로직 찾기]
* // --------------------------------------------------------------------------------------
* // [SEARCH FAST] : [기기 등록 요청 실시 >> 응답 결과 확인]
* // --------------------------------------------------------------------------------------
*
* // --------------------------------------------------------------------------------------
*
* // --------------------------------------------------------------------------------------
*
* // --------------------------------------------------------------------------------------
*
* // --------------------------------------------------------------------------------------
*/
// ------------------------------------------------------------------------------------------
// TODO [사용 방법]
// ------------------------------------------------------------------------------------------
/*
new Thread(){
@Override
public void run(){
try {
// -------------------------------------------------
// TODO [1]. 소켓 통신을 하기 위한 IP , PORT 선언
// -------------------------------------------------
String ip = "192.168.1.1";
int port = 5000;
// --------------------------------------
// TODO [2]. [소켓 모듈 클래스 인스턴스 초기화]
// --------------------------------------
C_Udp_Client_Socket_Module c_socket_module = C_Udp_Client_Socket_Module.getInstance();
c_socket_module.setContext(A_Intro.this);
// --------------------------------------
// TODO [3]. [소켓 생성 수행]
// --------------------------------------
if(c_socket_module.createSocket() == true) { // [소켓 생성 상태 확인]
// --------------------------------------
// TODO [4]. [기기 등록 요청 수행]
// --------------------------------------
HashMap<String, Object> deviceRegMap = c_socket_module.request_Device_Reg(ip, port);
S_Log._W_("소켓 통신 :: 디바이스 등록 요청 수행 결과 확인", new String[]{
"SUCCESS :: " + String.valueOf(deviceRegMap.get(c_socket_module.RETURN_SUCCESS_FLAG))
});
// --------------------------------------
// TODO [5]. [소켓 연결 종료]
// --------------------------------------
c_socket_module.closeSocket();
}
else {
S_Log._E_("소켓 생성 실패", null);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}.start();
*/
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
// TODO [전역 변수 선언]
// ------------------------------------------------------------------------------------------
private String ACTIVITY_NAME = "C_Udp_Client_Socket_Module";
private Context mMainCtx; // [컨텍스트]
private DatagramSocket mSocket; // [소켓]
public static final String RETURN_SUCCESS_FLAG = "RETURN_SUCCESS_FLAG"; // [리턴 데이터 반환 키 값]
public static final String RETURN_ERROR_MESSAGE = "RETURN_ERROR_MESSAGE"; // [리턴 데이터 반환 키 값]
// ------------------------------------------------------------------------------------------
// TODO [콘텍스트 지정]
// ------------------------------------------------------------------------------------------
public void setContext(Context ctx) {
mMainCtx = ctx;
}
// ------------------------------------------------------------------------------------------
// TODO [인스턴스 생성]
// ------------------------------------------------------------------------------------------
public static C_Udp_Client_Socket_Module getInstance() { return C_Udp_Client_Socket_Module.LazyHolder.INSTANCE; }
private static class LazyHolder {
private static final C_Udp_Client_Socket_Module INSTANCE = new C_Udp_Client_Socket_Module();
}
// ------------------------------------------------------------------------------------------
// TODO [소켓 생성 실시]
// ------------------------------------------------------------------------------------------
public synchronized Boolean createSocket() {
S_Log._D_(ACTIVITY_NAME + " :: 소켓 생성 수행", null);
boolean returnData = false;
try{
if (mMainCtx != null) {
// TODO [와이파이 연결 상태 체크]
if (C_StateCheck.isWifiConnected(mMainCtx) == true){
// TODO [리턴 변수값 변경]
returnData = true;
S_Log._W_(ACTIVITY_NAME + " :: 소켓 생성 성공 :: WIFI_IS_CONNECTED", null);
}
else {
S_Log._E_(ACTIVITY_NAME + " :: 소켓 생성 에러", new String[]{ "Error :: wifi connected false" });
}
}
else {
S_Log._E_(ACTIVITY_NAME + " :: 소켓 생성 에러", new String[]{ "Error :: mMainCtx is null" });
}
} catch (Exception e) {
S_Log._E_(ACTIVITY_NAME + " :: 소켓 생성 에러", new String[]{ "Error :: " + String.valueOf(e.getMessage()) });
}
// TODO [소켓 지정 실시]
if (returnData == true){
try { mSocket = new DatagramSocket(); } catch (Exception e){ e.printStackTrace(); }
}
else {
// [널 초기화 소켓]
try {
if (mSocket != null){
mSocket.close();
mSocket = null;
}
}
catch (Exception e){
e.printStackTrace();
}
}
return returnData;
}
// ------------------------------------------------------------------------------------------
// TODO [소켓 연결 종료]
// ------------------------------------------------------------------------------------------
public synchronized void closeSocket() {
// [리턴 변수 선언]
boolean isClose = false;
// [로직 처리 수행]
try {
// [생성된 소켓이 있는 경우 종료 및 스트림 닫기]
if(this.mSocket != null) {
this.mSocket.close();
isClose = this.mSocket.isClosed();
this.mSocket = null;
}
else {
isClose = true;
}
}
catch (Exception e) {
S_Log._printStackTrace_(null, S_FinalData.LOG_BUG_STATE, null, e);
}
S_Log._E_(ACTIVITY_NAME + " :: 소켓 연결 종료 수행", new String[]{
"소켓 종료 상태 :: " + String.valueOf(isClose)
});
}
// ------------------------------------------------------------------------------------------
// TODO [SEARCH FAST] : [기기 등록 요청 실시 >> 응답 결과 확인]
// ------------------------------------------------------------------------------------------
public synchronized HashMap request_Device_Reg(String serverIp, int serverPort) {
S_Log._D_(ACTIVITY_NAME + " :: 기기 등록 요청 수행", new String[]{
"SERVER_IP :: " + String.valueOf(serverIp),
"SERVER_PORT :: " + String.valueOf(serverPort)
});
/**
* // ----------------------------------------
* TODO [REQUEST] : [APP >> DEVICE]
* // ----------------------------------------
*
* {
* "reg_name" : "TOWK"
* }
*
* // ----------------------------------------
* */
/**
* // ----------------------------------------
* TODO [RESPONSE] : [DEVICE >> APP]
* // ----------------------------------------
*
* {
* "result" : true
* }
*
* // ----------------------------------------
* */
// -----------------------------------------------
// [리턴 변수 선언]
// -----------------------------------------------
HashMap<String, Object> returnData = new HashMap<>();
// -----------------------------------------------
// [로직 처리 수행]
// -----------------------------------------------
try {
// -----------------------------------------
// TODO [DatagramSocket 널 체크 수행]
// -----------------------------------------
if (mSocket == null){
returnData.put(RETURN_SUCCESS_FLAG, false);
returnData.put(RETURN_ERROR_MESSAGE, "Error :: DatagramSocket Is Null");
return returnData;
}
// -----------------------------------------
// -----------------------------------------
// TODO [App To Device] : [디바이스 등록 요청 실시]
// -----------------------------------------
JSONObject reqJson = new JSONObject();
reqJson.put("reg_name", "TWOK");
String requestData = reqJson.toString();
byte[] requestByte = requestData.getBytes(StandardCharsets.UTF_8); // [UTF-8 형식 바이트]
S_Log._D_(ACTIVITY_NAME + " :: [요청] :: [APP] >> [DEVICE] :: 기기 등록 요청 수행", new String[]{
"REQUEST [STRING] :: " + requestData.toString(),
"REQUEST [BYTE] :: " + Arrays.toString(requestByte)
});
DatagramPacket requestPacket = new DatagramPacket(requestByte, requestByte.length, InetAddress.getByName(serverIp),serverPort);
mSocket.send(requestPacket); // [IP, PORT 지정 패킷 전송]
// -----------------------------------------
// -----------------------------------------
// TODO [Device To App] : [디바이스 정보 응답 확인 실시]
// -----------------------------------------
byte[] responseByte = new byte[6144];
DatagramPacket responsePacket = new DatagramPacket(responseByte, responseByte.length);
mSocket.receive(responsePacket); // [응답 값을 저장할 저장소 지정]
// [byte to string 변환]
String jsonString = new String(responsePacket.getData(), "UTF-8");
jsonString = jsonString.replaceAll(" ", "");
S_Log._D_(ACTIVITY_NAME + " :: [응답] :: [DEVICE] >> [APP] :: 기기 등록 응답 확인", new String[]{
"RESPONSE :: " + jsonString.toString()
});
// [리턴 데이터 삽입]
returnData.put(RETURN_SUCCESS_FLAG, true);
returnData.put(RETURN_ERROR_MESSAGE, "");
// -----------------------------------------
}
catch (Exception e){
S_Log._printStackTrace_(null, S_FinalData.LOG_BUG_STATE, null, e);
// [에러 발생 데이터 삽입]
returnData.put(RETURN_SUCCESS_FLAG, false);
returnData.put(RETURN_ERROR_MESSAGE, "Exception :: " + String.valueOf(e.getMessage()));
}
// [리턴 반환 실시]
return returnData;
}
} // TODO [클래스 종료]
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments