본문 바로가기

Programming/Android

android Soket를 활용한 통신 - Server

반응형
android에서 socket을 활용하여 Server, Client를 구현하여 통신하는 법을 알아보도록 하겠습니다.

우선 Server를 만드는 일인데요.
android 디바이스에서 Server를 만들기 위해서는 Wifi환경이어야 가능 합니다.

public static String getLocalIpAddress(Context appContext) {
WifiManager wifiMgr = (WifiManager) appContext.getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
String ipAddress = String.format("%d.%d.%d.%d"
, (ip & 0xff)
, (ip >> 8 & 0xff)
, (ip >> 16 & 0xff)
, (ip >> 24 & 0xff));
return ipAddress;
}
Wifi환경에서 디바이스의 IP주소를 가져오는 소스입니다.
Server가 직접 쓰는 것은 아니지만 Client가 Server에 접근하기 위해서는 필요 합니다.

private ServerSocket serverSocket;

private void createServer()
{
try {
isRunning = true;
serverSocket = new ServerSocket(SERVER_PORT);
new Thread(new Runnable() {
@Override
public void run() {
while (isRunning) {
Log.d(LOG_TAG, "Server Wait");
try {
Socket socket = serverSocket.accept();
Log.d(LOG_TAG, socket.getInetAddress() + " connect");

listenClientSocket(socket);
} catch (IOException e) {
e.printStackTrace();
}


}
}
}).start();

} catch (IOException e) {
e.printStackTrace();
}
}
서버 생성 부분 입니다.
포트를 셋팅하여 서버를 생성하고
쓰레드 안에서 Client의 연결을 기다립니다.
accept() 함수를 통하여 client Socket의 값을 받습니다.


private void listenClientSocket(final Socket socket) {
if (socket == null) {
return;
}

new Thread(new Runnable() {
private DataInputStream in;
private DataOutputStream out;

@Override 
        public void run() {

try {
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());

} catch (IOException e) {
e.printStackTrace();
}

try {// 계속 듣기만!! 
                while (in != null) {
String msg = in.readUTF();

Log.d(LOG_TAG, "listent : " + msg);
}
} catch (IOException e) {
// 사용접속종료시 여기서 에러 발생.
}


}
}).start();
}
Client Socket에 대한 연결을 개별 처리 하는 부분 입니다.
DataInputStream은 메세지 읽기
DataInputStream은 메세지 보내기

private void sendData(DataOutputStream out, String sMsg) throws IOException {
if(out == null)
{
return;
}

out.writeUTF(sMsg);
}
메세지를 Client Socket으로 보내는 부분 입니다.
writeUTF을 통해 텍스트를 전송 할수 있습니다.

try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Server Socket은 close함수를 통해서 종료 할수 있습니다.

다음에는 이어서 Client Socket을 다루어 보겠습니다.