반응형

인터넷에는 많은 컴퓨터들이 연결되어 있습니다.

그리고 그 컴퓨터들 간에 데이터를 보내고 받는 방식에 대해 이해하고 싶다면 TCP/IP라 불리는 통신 방식을 이해하는 것이 필요합니다.

IP 주소를 이용해 목적지 호스트를 찾아내고 포트를 이용해 통신 접속점을 찾아내는 소켓 연결에 대해 알아보고 나면 네트워킹이 무엇인지 좀 더 잘 이해될 것입니다.

소켓이 무엇이고 어떻게 사용해야 하는지 알아봅시다.




소켓

소켓은 서버 소켓과 클라이언트 소켓을 만들고 서로 연결하는 과정을 거치게 됩니다.

서버 소켓은 연결을 기다리는 역할을 하고 클라이언트 소켓은 연결을 만드는 역할을 합니다.

클라이언트에서 연결을 만들고 나면 데이터를 보내거나 받을 수 있습니다.

서버 소켓을 사용하기 위하여 간단한 안드로이드 서버 앱을 만들어 봅니다.

다만 이클립스를 추가로 설치해야 하는 번거로움이 있어, 안드로이드 스튜디오에서 앱으로 서버 소켓을 만듭니다.

안드로이드 스튜디오에서 프로젝트를 만들고 서버 소켓을 만듭니다.

 

서버 소켓

자바에서 사용하던 서버 소켓의 코드를 안드로이드에서도 그대로 사용할 수 있습니다.

ServerSocket 클래스를 이용해 객체를 만들고 accept 함수를 호출하면 클라이언트로부터의 접속을 기다리게 됩니다.

            int portNumber = 5001; 
            System.out.println("Starting Java Socket Server ..."); 
 
            ServerSocket aServerSocket = new ServerSocket(portNumber);
            System.out.println("Listening at port " + portNumber + " ...");
 
            while(true) {
                Socket sock = aServerSocket.accept();

클라이언트 소켓을 기다릴 때는 blocking mode로 동작하므로 프로그램이 대기하게 됩니다.

그리고 accept 메소드 이후의 코드는 클라이언트가 접속했을 때 동작합니다.

이 때문에 while 문을 사용하는 경우가 많습니다.

 

데이터 보내고 받기

데이터를 보내고 받는 가장 간단한 방법은 ObjectOutputStream과 ObjectInputStream을 사용하는겁니다.

ObjectOutputStream 객체를 만들고 writeObject 메소드를 이용해 데이터를 보냅니다.

이때 전송하려는 객체(데이터)는 직렬화(Serialization) 되어 있어야 합니다.

ObjectOutputStream outstream = new ObjectOutputStream(sock.getOutputStream());
outstream.writeObject(obj + " from Server.");
outstream.flush();

ObjectInputStream 객체를 만들고 readObject 메소드를 이용해 데이터를 읽어 들일 수 있습니다.

ObjectInputStream instream = new ObjectInputStream(sock.getInputStream());
Object obj = instream.readObject();
System.out.println("Input : " + obj);


클라이언트 소켓

Socket 클래스는 클라이언트 소켓을 만들 때 사용합니다.

클라이언트 소켓을 만들 때는 서버의 IP와 포트 번호를 전달해야 하는데, 서버에서 지정한 포트 번호와 동일한 포트 번호를 사용해야 합니다.

            int portNumber = 5001;
            Socket sock = new Socket("localhost", portNumber);


버튼 클릭 시에 서버에 요청하기

앱의 XML 레이아웃에 버튼을 하나 추가하고 버튼을 클릭했을 때 서버에 요청합니다.

서버 소켓을 만들어 두었으므로 클라이언트 소켓을 만들어 접속하면 됩니다.

단, 안드로이드에서는 인터넷을 사용할 때 스레드를 이용해야 하며 INTERNET 권한이 있어야 합니다.

button01.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        String addr = input01.getText().toString().trim();
        ConnectThread thread = new ConnectThread(addr)
        thread.start();
    }
});

권한은 AndroidManifest.xml 파일에 추가합니다.

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

서버 소켓에서 요청을 보내고 응답을 받을 때 사용했던 코드는 클라이언트 소켓에 동일하게 사용될 수 있습니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기