2011년 6월 9일 목요일

자바의 소켓 프로그래밍(Socket Programming)

오늘은 그동안 뜸(?)을 들여왔던 자바의 네트워크 프로그래밍의 초석을 다지게될 TCP 프로토콜 방식의 소켓 프로그래밍(Socket Programming)에 대해서 공부해 보기로 하자. 소켓(Socket)이란 네트워크상에서 서버와 클라이언트 두개의 프로그램이 특정 포트를 통해 양방향 통신이 가능하도록 만들어주는 소프트웨어 장치라 말할수 있다. 좀 더 자세히 설명하자면 자바에서는 소켓 클래스가 서버와 클라이언트 프로그램들간의 연결을 가능하도록 만들어준다. 더 자세하게 설명하자면 java.net 패키지에 있는 두개의 클래스 ServerSocket 클래스(서버측에서만 필요)와 Socket 클래스(서버와 클라이언트측 양쪽에서 다 필요)를 이용하여 서버와 클라이언트간의 통신을 가능하게 만든다.

자바의 네트워크 프로그래밍에 대해 아무런 생각(?)이 없는 이들은 예전에 필자가 이 부분에 대해 설명하였으니 관련 강좌를 한번 읽어보고 오기 바란다. 네트워크 프로그래밍은 상당히 즐겁고 흥미로운 분야인데도 불구하고 자바를 공부하는 이들의 태반이 고통아닌 고통을 여기서 겪고 있고 자포자기하는 경향이 많은데 그런 이들에게 오늘 강좌는 여러분에게 가뭄에 단비같은 아니 사막에서 오아시스를 찾은 그런 큰 기쁨을 여러분에게 안겨줄 것이다. 그만큼 자세하고도 세세한 부분까지 여러분의 이해를 돕기위해 초정성(?)을 기울였으니 여러분도 그에 응답하여 잠시 주위의 모든 것을 차단하고 이번 강좌에 더도말고 30분만 투자하기 바란다. 초반에 언급하였지만 그동안 자바의 네트워크만 언급해도 몸서리쳤던 이들도 본 단원의 소켓 프로그래밍을 통해 자바 네트워크 프로그래밍의 반석을 오늘 이 자리에서 다지게되는 귀중한 시간(?)이 될것이라 확신한다.^^

자바가 이렇게 많은 이들에게 사랑받을수 있었던 것은 네트워크상에서 부담없이 구현되는 애플릿의 영향이 컸고 그 중에서도 대표적인 것이 통신상에서 유저들이 서로 간단히 대화할수 있도록 만든 자바 채팅 프로그램이라 할수 있겠다. 이런 자바 채팅 프로그램의 기초가 바로 서버와 클라이언트간의 연결이 가능해야하는 것인데 이게 소켓 프로그래밍으로 가능하다. 본 단원에서는 소켓 프로그래밍의 기본을 배우는 시간인만큼 클라이언트가 어떻게 서버로 연결시도를 하고 서버가 어떻게 클라이언트의 연결요청을 받아들이고 처리하는지를 프로그램으로 만들어볼 것이다. 오늘은 두개의 프로그램을 만들텐데 하나는 서버측에서 사용할 자바 프로그램(Test60Server.java)과 클라이언트측에서 사용할 자바 프로그램(Test60Client.java)이다. 자바파일 이름은 필자가 편하게 붙인 것이니 딴지 걸지 말기 바란다.ㅎㅎ 그럼 서버측에서 사용할 프로그램을 어떻게 만들어야되는지 먼저 살펴보기로 하자.


위의 그림은 자바에서 서버 프로그램이 어떤식으로 동작하는지 전체적인 개요를 보여주고 있는데 서버에서 클라이언트의 요청을 받아들이려면 일단 ServerSocket 클래스를 생성하고 accept( ) 메소드를 이용하여 클라이언트의 요청을 받아들일 준비를 한다. 그리고 서버의 Socket 클래스를 통해 서버와 클라이언트간의 소켓 연결고리를 만들어 서로 통신할수 있는 선로를 확보하고 클라이언트의 메세지를 BufferedReader 클래스를 통해 받아들이고 이 받아들인 메세지를 PrintWriter 클래스를 통해 서버측 화면에 출력하고 다시 클라이언트로 이 메세지를 보낸다. 여기까지가 서버 프로그램에서 하는 일이다.


서버측에서는 소켓 간에 통신할수 있도록 선로를 만들어주는게 주된 일이라 하겠다. 자바 소스를 보면 이해가 쉬울 것이다. 주석을 꼼꼼하게 달아놓았으니 어려울게 없다고 본다. 그럼 서버 소스를 살펴보자. ^^


소켓을 이용하여 서로 통신할수 있도록 만들려면 포트가 필요하다. 예제에서는 2011년을 기념하는 뜻(?)에서 포트번호를 2011로 지정하였다. 즉 서버와 연결하려면 클라이언트에서 포트번호 2011로 연결을 시도하여야함을 알수 있다. 예제에 표기된 상세한 주석으로 인해 사실 설명을 따로할 필요가 없을 정도다. 그냥 천천히 예제 소스를 보기만 해도 이해가 될 것이다.

자 이제는 클라이언트쪽을 보기로 하자. 클라이언트에서는 Socket 클래스를 생성하여 서버로 연결요청을 하고 서버에서 연결을 수락하면 PrintWriter 클래스를 통해 메세지(강이의 자바강좌)를 서버로 보낸다. 그리고 BufferedReader 클래스를 이용하여 서버에서 받은 메세지를 클라이언트측 화면에 출력한다. 즉 클라이언트에서 송신한 메세지가 서버를 통해 다시 그 메세지를 수신하는 과정을 확인할수 있다.


위의 클라이언트 예제 소스를 보면서 자바로 어떻게 쓰는지 살펴보기 바란다. 이것도 역시 주석이 빵빵(?)하므로 그냥 보면 저절로 깨우쳐지리라 생각한다. 이곳에 쓸 설명을 보기 쉽도록 주석에 다 달아놓았으니 설명 부족하다고 그러지 말아라.ㅎㅎ


바로 위의 그림이 오늘 배운 서버와 클라이언트 프로그램의 전체 개요도라 할수 있겠다. 전체적인 소켓 프로그램의 흐름이 위와 같다. 자 그럼 마지막으로 위의 프로그램들을 어떻게 실행할수 있는지 살펴보기로 하겠다. 네트워크 즉 쌍방향 프로그래밍인만큼 서버와 클라이언트쪽 두개의 프로그램을 만들었다. 따라서 실행도 양쪽에서 해야하므로 명령프롬프트창을 열어 서버 프로그램을 실행시킨 후에 다시 명령프롬프트창을 열어 클라이언트 프로그램을 실행시키면 방금 우리가 공부한 소켓 프로그램이 정상적으로 작동할 것이다.



이로서 소켓 프로그래밍에 대한 실행까지 마쳤다. 해보면 알겠지만 서버와 클라이언트 프로그램에서 서로 송수신하는 과정을 보는 것만으로도 흥미진진할 것이다. 소켓 프로그래밍은 자바의 네트워크 프로그래밍을 논할때 빠지지 않는 기본중의 기본이다. 본 예제를 뚫어지게 공부하다 보면 소켓 프로그래밍에 대해서 어느정도 자신감(?)이 생겨나리라 생각하니 지겹도록 쳐다보기 바란다. 수고 많았다. ^^

댓글 19개:

  1. 글쓴이님 엄청 꼼꼼하시구 되게 효과적이고 잘 알아듣게 설명하시는거 같아요 굉장하다고 생각해요 ㅋㅋ 그리고 필체도 뭔가 귀여움 ㅋㅋㅋㅋ 권위적인거 같은데 귀여움 ㅋㅋㅋ

    답글삭제
  2. 생각보다 개념정리가 좋아서 도움이 되네요
    자주 참고 해야겟습니다.

    답글삭제
  3. 강이님 강이님 강좌 쭉 읽어왔는대요..
    정말 그어떤 사이트보다 자세하고 알아듣기쉽고 진짜 ㅡㅡ
    대박인듯..혹시 책도 쓰셨나요? 정말 최곱니다 ..;;

    답글삭제
  4. 강이님 강좌 정말 이해하기 쉽고 좋아요!
    책 쓰신거 없나요? 있으시면 구매하고 싶을 의사가 100%나 들정도로 재밌어요!

    답글삭제
  5. 저 진짜 자바 초보중의 쌩초보인데 이 강의 보고 살짝 감이 오기 시작했음..명강의네요^ㅆ^

    답글삭제
  6. 감사합니다. 너무너무 잘 이해되요!

    답글삭제
  7. My family always say that I am wasting my time here
    at web, however I know I am getting know-how everyday by
    reading such good articles.
    Also visit my web site :: grumpy cat

    답글삭제
  8. 정보 감사합니다. ㅎㅎ

    답글삭제
  9. jar 파일로 Export 한 후에 윈도우에서 실행시켜보니 한글이 깨져서 나옵니다.. 어떻게 해결할 수 있는 방법이 없을까요?? 또한, 맥에서 실행시켰을 때에 콘솔창에서 실행시킬 때에는 한글이 깨지지않지만, 실행파일 더블클릭으로 실행시켰을 때에는 한글이 깨지네요..

    답글삭제
  10. When some one searches for his required thing, so he/she needs
    to be available that in detail, thus that thing is maintained over here.
    My web blog : vuelos a hongkong

    답글삭제
  11. Its like you read my mind! You appear to know a
    lot about this, like you wrote the book in it
    or something. I think that you can do with a few pics to drive the message home a little bit, but other than that,
    this is magnificent blog. An excellent read. I'll definitely be back.
    Stop by my website viajes a china

    답글삭제
  12. Hey there! Do you use Twitter? I'd like to follow you if that would be okay. I'm absolutely enjoying your blog and look forward to new updates.
    Feel free to surf my homepage vuelos a china

    답글삭제
  13. Hi! I could have sworn I've been to this website before but after
    browsing through some of the articles I realized it's
    new to me. Regardless, I'm certainly delighted I found it and I'll
    be bookmarking it and checking back often!

    My web blog - vacate cleaning

    답글삭제
  14. 작성자가 댓글을 삭제했습니다.

    답글삭제
  15. 감사합니다!! 한가지 더 배우고 갑니다!!

    답글삭제
  16. 왜 콘솔창에서 에러가 나는걸까요.....?
    똑같이따라썻는데.......

    답글삭제
  17. 와 소켓프로그래밍 엄청 고민하고 있었는데 이거보고 완벽히는 아니지만 거의 이해 됬습니다. 감사합니다!!

    답글삭제