Notice
Recent Posts
Recent Comments
Link
투케이2K
142. (TWOK/UTIL) [Android/Java] C_Udp_Server_Single_Socket_Module : UDP 서버 소켓 모듈 - UDP Server Socket 본문
투케이2K 유틸파일
142. (TWOK/UTIL) [Android/Java] C_Udp_Server_Single_Socket_Module : UDP 서버 소켓 모듈 - UDP Server Socket
투케이2K 2024. 11. 15. 20:16[설 명]
프로그램 : Android / Java
설 명 : C_Udp_Server_Single_Socket_Module : UDP 서버 소켓 모듈 - UDP Server Socket
[소스 코드]
package com.example.javaproject.C_Module;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.DhcpInfo;
import android.net.Network;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import com.example.javaproject.C_Util;
import com.example.javaproject.S_FinalData;
import com.example.javaproject.S_Log;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class C_Udp_Server_Single_Socket_Module {
/**
* // --------------------------------------------------------------------------------------
* TODO [클래스 설명]
* // --------------------------------------------------------------------------------------
* 1. [설명] : UDP 통신 서버 모듈 클래스
* // --------------------------------------------------------------------------------------
* 2. 참고 : 소켓을 활성화 하기 위해서는 특정 인터넷 사용 가능한 와이파이 또는 로컬 핫스팟에 연결이 필요
* // --------------------------------------------------------------------------------------
* 3. 참고 사이트 :
*
* [안드로이드 : 스마트 콘피그 (SmartConfig) 와이파이 Wifi 연결 및 소켓 통신 수행]
*
* https://blog.naver.com/kkh0977/223132108515?trackingCode=blog_bloghome_searchlist
*
*
* [안드로이드 기기 로컬 핫스팟 WIFI 와이파이 SSID 조회 및 다이렉트 AP 연결 로직]
*
* https://blog.naver.com/kkh0977/223646733424?trackingCode=blog_bloghome_searchlist
*
*
* [WifiInfo 및 DhcpInfo 사용해 현재 연결된 와이파이 (wifi) 정보 확인 실시]
*
* https://blog.naver.com/kkh0977/222295029304?trackingCode=blog_bloghome_searchlist
* // --------------------------------------------------------------------------------------
* */
/**
* // --------------------------------------------------------------------------------------
* TODO [빠른 로직 찾기 : 주석 로직 찾기]
* // --------------------------------------------------------------------------------------
* // [SEARCH FAST] : [서버 소켓 생성 실시]
* // --------------------------------------------------------------------------------------
* // [SEARCH FAST] : [소켓 연결 종료]
* // --------------------------------------------------------------------------------------
* // [SEARCH FAST] : [클라이언트 접속 확인 및 실시간 메시지 수신 확인]
* // --------------------------------------------------------------------------------------
* //
* // --------------------------------------------------------------------------------------
* //
* // --------------------------------------------------------------------------------------
*/
// ------------------------------------------------------------------------------------------
// TODO [사용 방법]
// ------------------------------------------------------------------------------------------
/*
try {
new Thread(){
@Override
public void run(){
try {
// -------------------------------------------------
// TODO [1]. 서버 소켓 통신을 하기 위한 PORT 선언
// -------------------------------------------------
int port = 5000;
// --------------------------------------
// TODO [2]. [서버 소켓 모듈 클래스 인스턴스 초기화]
// --------------------------------------
C_Udp_Server_Single_Socket_Module c_server_socket_module = C_Udp_Server_Single_Socket_Module.getInstance();
c_server_socket_module.setContext(A_Intro.this);
// --------------------------------------
// TODO [3]. [서버 소켓 활성 수행]
// --------------------------------------
if(c_server_socket_module.createSocket(port) == true) { // [소켓 연결 상태 확인]
// --------------------------------------
// TODO [4]. [hello 메시지 전달 수행]
// --------------------------------------
c_server_socket_module.onReceiveMessage();
// --------------------------------------
// TODO [5]. [서버 소켓 연결 종료]
// --------------------------------------
// c_server_socket_module.closeSocket();
}
else {
S_Log._E_("서버 소켓 활성 실패", null);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
catch (Exception e) {
S_Log._printStackTrace_(null, S_FinalData.LOG_BUG_STATE, null, e);
}
*/
// ------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------
// TODO [전역 변수 선언]
// ------------------------------------------------------------------------------------------
private String ACTIVITY_NAME = "C_Udp_Server_Single_Socket_Module";
private Context mMainCtx; // [컨텍스트]
String ip = ""; // [아이피 주소]
DatagramSocket mSocket = null; // [소켓]
Thread mThread = null; // [서버 스레드]
ArrayList clientList; // [클라이언트 담음]
// ------------------------------------------------------------------------------------------
// TODO [콘텍스트 지정]
// ------------------------------------------------------------------------------------------
public void setContext(Context ctx) {
mMainCtx = ctx;
}
// ------------------------------------------------------------------------------------------
// TODO [인스턴스 생성]
// ------------------------------------------------------------------------------------------
public static C_Udp_Server_Single_Socket_Module getInstance() { return C_Udp_Server_Single_Socket_Module.LazyHolder.INSTANCE; }
private static class LazyHolder {
private static final C_Udp_Server_Single_Socket_Module INSTANCE = new C_Udp_Server_Single_Socket_Module();
}
// ------------------------------------------------------------------------------------------
// TODO [SEARCH FAST] : [서버 소켓 생성 실시]
// ------------------------------------------------------------------------------------------
public synchronized Boolean createSocket(int port) {
ConnectivityManager connectivity = (ConnectivityManager) mMainCtx.getSystemService(Context.CONNECTIVITY_SERVICE);
boolean returnData = false;
// [널 초기화 수행]
try {
if (mSocket != null){
mSocket.close();
mSocket = null;
}
}
catch (Exception e){
e.printStackTrace();
}
// [로직 처리 수행]
try{
if (connectivity != null) {
for (Network network : connectivity.getAllNetworks()) { // TODO [연결된 네트워크 확인]
NetworkInfo networkInfo = connectivity.getNetworkInfo(network);
if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { // TODO [와이파이 연결 상태 체크]
if (networkInfo.isConnected()) {
WifiManager wifimanager = (WifiManager) mMainCtx.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcpInfo = wifimanager.getDhcpInfo();
int wIp = dhcpInfo.ipAddress;
ip = String.format("%d.%d.%d.%d", (wIp & 0xff), (wIp >> 8 & 0xff), (wIp >> 16 & 0xff), (wIp >> 24 & 0xff));
if (C_Util.stringNotNull(ip) == true){
S_Log._W_(ACTIVITY_NAME + " :: 서버 소켓 생성 성공", new String[]{
"IP :: " + String.valueOf(ip),
"PORT :: " + String.valueOf(port)
});
// [서버 소켓 지정 실시]
mSocket = new DatagramSocket(port);
returnData = true;
}
else {
S_Log._E_(ACTIVITY_NAME + " :: 서버 소켓 생성 에러", new String[]{ "ip is null" });
}
}
}
}
}
else {
S_Log._E_(ACTIVITY_NAME + " :: 서버 소켓 생성 에러", new String[]{ "Error :: ConnectivityManager is null" });
}
} catch (Exception e) {
S_Log._E_(ACTIVITY_NAME + " :: 서버 소켓 생성 에러", new String[]{ "Exception :: " + String.valueOf(e.getMessage()) });
}
return returnData;
}
// ------------------------------------------------------------------------------------------
// TODO [SEARCH FAST] : [소켓 연결 종료]
// ------------------------------------------------------------------------------------------
public synchronized void closeSocket() {
// [로직 처리 수행]
try {
// [소켓 닫기]
if(mSocket != null) {
mSocket.close();
mSocket = null;
}
// [스레드 닫기]
if (mThread != null){
mThread.interrupt();
}
}
catch (Exception e) {
S_Log._printStackTrace_(null, S_FinalData.LOG_BUG_STATE, null, e);
}
S_Log._E_(ACTIVITY_NAME + " :: 서버 소켓 연결 종료 수행", null);
}
// ------------------------------------------------------------------------------------------
// TODO [SEARCH FAST] : [클라이언트 접속 확인 및 실시간 메시지 수신 확인]
// ------------------------------------------------------------------------------------------
public synchronized void onReceiveMessage() {
// [로직 처리 수행]
if(mSocket != null && mThread != null) { // TODO [소켓이 널이 아닌 경우]
S_Log._E_(ACTIVITY_NAME + " :: 클라이언트 접속 및 실시간 메시지 수신 확인 실패", new String[]{ "설 명 :: 소켓 활성 된 상태 (ServerSocket Not Null)" });
}
else { // TODO [소켓이 널인 경우]
S_Log._D_(ACTIVITY_NAME + " :: 클라이언트 접속 및 실시간 메시지 수신 확인 수행", 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 = new String(inPacket.getData(), "UTF-8");
S_Log._W_(ACTIVITY_NAME + " :: [클라이언트 >> 서버] :: 전달 받은 메시지 확인", 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 + " :: [서버 >> 클라이언트] :: 전송 수행 메시지 확인", new String[]{
String.valueOf(new String(outPacket.getData(), "UTF-8"))
});
// --------------------------------------------------------------------
// TODO [무한 루프 탈출 로직 작성]
if (mThread == null || mSocket == null) {
S_Log._E_(ACTIVITY_NAME + " :: 서버 소켓 접속 체크 종료", 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);
}
}
}
} // TODO [클래스 종료]
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments