[Java / 자바] 소켓 통신 (Socket)

공부/Java  2015.06.05 22:03

안녕하세요. 명월입니다.
이번 포스트는 Socket에 대해 공부하겠습니다.


소켓 개념은 자바뿐만 아니라 C / C++ / C# 언어와 같습니다. 우리가 통신할 때에 전송할 패킷(데이터)이 컴퓨터에서 랜 케이블로 나갑니다. 그리고 그 랜 케이블에서 라우터, DNS 순으로 패킷이 이동합니다. 그 이동된 패킷들은 다시 라우터를 타고 목표로 하는 컴퓨터로 전송이 돼서 프로그램을 찾아 통신이 이루어집니다. 그런데 우리는 이런 일련의 전송형태를 다 설정을 하지 않습니다.
이 통신 형태들은 OS 단계에서 설정되고(OSI 7계층), 프로그램을 작성할 때는 소켓, 즉 「그 모든 설정 위에 꽂아서 쓴다」라는 개념으로 소켓을 통해서 통신이 됩니다.


링크 - [위키백과] OSI 모형


소켓의 사용법과 흐름에 대해 설명하겠습니다.
소켓은 서버가 로컬 IP를 가지고 Port를 열고(Bind) 클라이언트 접속을 기다립니다. (Listen) 그리고 클라이언트는 서버의 IP주소와 Port로 접속(Connection)해서 연결되면, 서버와 클라이언트는 Send, Recieve형태로 패킷을 주고받습니다. 서로의 통신이 끝나면 close로 접속을 끊습니다.



출처 - http://jkkang.net/unix/netprg/chap2/net2_1.html


그럼 소켓의 원리로 프로그램을 작성하겠습니다.



github 소스 보기 - Server.java



위 소스를 보시면 서버에서 9999라는 포트를 열고 accept 함수에서 대기상태에 들어갔습니다.


콘솔 상태에서 Port Listen 상태를 확인하니 「9999」가 열려 있는 것을 확인했습니다.


이번에는 클라이언트를 작성하여 테스트하겠습니다.



github 소스보기 - Client.java



실행하니 결과는 Hello world가 나왔습니다. 서버측의 콘솔을 확인하니 Connect, recieve - OK 라는 메시지를 받았네요.



흐름에 대해 설명을 하면 먼저 서버가 9999 포트로 Listen 상태로 클라이언트를 대기합니다. 그런 후 클라이언트는 9999포트로 접속합니다.
이때 클라이언트는 서버로부터 메시지 대기를 하고 서버는 클라이언트로 「Hello world」의 11byte 메시지를 보냅니다.
그리고 서버는 클라이언트로부터 메시지를 대기하고 클라이언트는 서버로 「OK」의 2byte 메시지를 보냅니다. 클라이언트로부터 메시지를 받고 종료를 합니다.


저 같은 경우는 피시 한 대로 테스트했지만 테스트 환경이 허락되면 피시 두 대 이상으로 테스트하면 통신이 이루어지는 것을 확인할 수 있습니다.


---------------------블로그 개선중 이미지 깨짐 현상--------------------------2016년 3월 31일


댓글 2개가 달렸습니다.
댓글쓰기

  1. 2016.11.18 16:06 |  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. ㅎㄹ
    2017.07.27 16:04 신고 |  수정/삭제  댓글쓰기

    ㅗㅗㅎ