2011년 6월 9일 목요일

소켓을 이용한 서버와 클라이언트 프로그램

저번 시간에 배운 서버와 클라이언트 프로그램을 한층더 업그레이드하는 시간을 가져보기로 하겠다. 잠시 저번 강좌의 예제 프로그램에 대해서 설명하자면 서버 프로그램을 가동한후 클라이언트 프로그램이 특정 포트로 연결해서 서버로 메세지를 송신하고 다시 서버로부터 수신받아 프로그램이 끝나는 아주 심플한 프로그램이었다. 해봤으면 알겠지만 상당히 아쉬운 부분이 많았을텐데 특히 메세지를 원하는만큼 직접 전달하고 계속해서 송수신할수 있도록 만들순 없을까 하는 이들이 있었을 것이다.

이런 이들의 기대를 져버리지 않기위해 오늘 만들 프로그램은 메세지 하나만 보내고 끝나는게 아니라 계속해서 원하는 메세지를 입력할수 있게끔 만들고 더이상 입력이 없으면 알아서 서버와 클라이언트의 연결이 끊기도록 프로그램을 구성할 것이다. 본 강의를 보기 전에 본인이 직접 이와같은 프로그램을 만들어보고 난후에 본 단원을 공부하기 바란다. 그럼 오늘 만들 서버 프로그램과 클라이언트 프로그램의 예고편(?)을 순서대로 먼저 보기로 하자.



Test61Server.java
Test61Client.java

위의 두 파일을 다운받아 실행하면 그림과 같은 결과값을 얻을수 있다. 일단 서버 프로그램(Test61Server.java) 소스부터 설명하겠다. 저번 시간의 연장선상에 있으므로 바뀐 부분만 알면 공부하는데 큰 무리가 없을 것이다. 서버에서 메세지를 계속해서 받도록 만들어야하니 반복문을 사용해야겠구나 어렴풋이 짐작이 될 것이다. 예제에서는 while문을 사용하였고 그안에서 if문으로 입력값을 검사해 더이상 입력값이 없다고 확인되면 서버는 클라이언트와의 연결을 끊고 프로그램을 종료한다. 또한 try catch문을 사용하였는데 클라이언트에서 불가피하게 연결이 끊겼을시 서버에서도 이를 감지해 프로그램을 종료하도록 만들기 위해 try catch 구문을 사용하였다. 예제를 실행하면서 테스트 해보면 알게 될것이다.^^

다음은 클라이언트 프로그램(Test61Client.java)을 살펴보기로 하겠다. 일단 처음에 연결이 되면 축하 메세지를 띄운다. 그럴듯하게 보이라고 한번 넣어봤다.^^ Socket 클래스에 있는 isConnected( ) 메소드를 이용해 연결되었다는 true값을 돌려주면 축하 메세지가 나온다. 당근 항상 나올꺼다.ㅎㅎ 그리고 키보드로부터 문자열을 입력받도록 만드는데 어떻게 자바에서 구현하는지 모른다면 필자가 이에 관련한 강좌를 한적이 있으니 다시 한번 읽어보고 오기 바란다. 그리고 입력받은 메세지를 저번처럼 서버에 보내서 송수신을 하는데 이 부분도 서버처럼 클라이언트에서도 while문을 이용해 계속 반복해서 메세지를 보낼수 있게 만들고 더이상 메세지가 없는지 String 클래스에 있는 isEmpty( ) 메소드로 문자열에 입력값이 비어있는지 체크해서 비어있으면 while문을 빠져나와 프로그램을 종료하는 예제이다.

예제의 서버와 클라이언트 프로그램은 이해를 돕기 위해 상당히 쉽게 구성하였으나 안에 들어있는 내용은 매우 심오(?)하기 짝이 없다. 자바의 네트워크와 입출력에 관련된 부분을 함께 건드리고 있어 짧지만 조금 힘겨워하는 이가 있을지도 모르겠다. 허나 지금까지 강이의 자바강좌를 열심히 독파해온 이들이라면 문제없을것이라 믿는다. 오늘 강좌가 힘들게 느껴졌다면 예제와 관련된 저번 강좌들을 다시 복습하는 시간을 갖기 바라면서 오늘 강의는 이만 끝내겠다.^^

댓글 4개:

  1. 안녕하세요 이번에 소켓프로그래밍을 배우려고 하는 한 지망생 입니다. 저 죄송한데 강의를 보고 질문들 한가지 드리고 싶어서 글 남깁니다. 제가 예제문 가지고 실행 시켰는데 에러가 떳습니다. 인터넷 검색을 이용하여 보았더니 포트번호가 이미 사용중이라고 하더라구요;; 그래서 번호를 2015로 바꾸었는데.. 서버: 클라이언트의 접속을 기다립니다. 에서 더이상 진전이 없더라구요 ㅠㅠ 답변좀 부탁드리겠습니다 ㅠㅠ.
    // 좋은 강의 감사드립니다.

    답글삭제
  2. 처음의 이미 사용중인 에러는 서버 프로그램이 이미 하나가 돌아가고 있는데서 또 하나를 켜서 일어나는 문제 같구요
    포트번호를 2015로 바꾸셨을때 클라이언트가 접속을 못하는것은 클라이언트 소스코드에서도 포트번호를 2011에서 2015로 바꾸어주시면 해결될것 같습니다^^

    답글삭제
  3. 안녕하세요
    강좌 아주 잘 봤습니다.
    저는 클라이언트와 서버 모두
    BufferedReader로 읽고 DataOutputStream으로 전송해
    보았는데 서버에서 클라이언트로 보내는 메시지를
    클라이언트가 받지 못하는데 특별히 해줘야 하는게 있나요?

    답글삭제
  4. Hi friends, pleasant paragraph and fastidious arguments commented at this
    place, I am genuinely enjoying by these.
    Have a look at my website tattoos on love handles

    답글삭제