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을 다루어 보겠습니다.



댓글

주간 인기글

[정보] 인스타그램은 당신의 소리를 '듣고' 있을 수도 있습니다

[앱 디자인] 디자인 가이드 만들기 - 아이폰

푸시기능과 GCM / APNS

안드로이드에서 당겨서 새로고침(SwipeRefreshLayout) 쉽게 구현하기

Android CardView의 각 속성 설명