본문 바로가기
Web/Network

Java TCP/IP 통신 (2)

by 미티치 2016. 10. 7.

TCP / IP 프로토콜을 이용해서 서버와 클라이언트의 통신을 하는 개념적인 부분을 설명했었는데,  이제 자바로 


서버 측에서 ServerSocket을 만들어 accept() 메소드를 이용해서 클라이언트와의 연결을 기다립니다. 이 accept 메소드의 반환형이 클라이언트 소켓인데, 정확하게는 이 반환형이 Socket입니다. 우리가 Client에서 Socket clientSocket = new Socket(ip, port); 해서 생성한 소켓으로 Server와 통신을하죠? 사실 말이 서버-클라이언트라서 서버에서는 대단한 ServerSocket을 생성하고 뭐 이런 것처럼 보이지만 사실 서버에서도 서버 소켓을 이용해서 포트를 열어놓고 클라이언트와의 연결이 되는 것을 기다리는데까지만 역할을 하고, 이 ServerSocket.accept() 메소드를 통해 클라이언트와 연결이 되느 순간 서버에서 클라이언트 소켓을 생성해서 client 측의 클라이언트 소켓과 통신을 합니다. 다시한번 강조하자면 사실 이 클라이언트 소켓도 정확하게 말하면 그냥 소켓이죠. 



기본적으로 응용프로그램은 우리가 짜는 소스 코드대로 줄줄이 읽어나가는 방식대로 명령을 실행합니다. 근데 이렇게 TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 있을 때, 이 응용프로그램이 서버와 통신을 하면서 동시에 통신과는 무관하게 사용자의 입력을 받아 처리하는 작업이 있다고 가정합시다. 이때 소스를 순서대로만 읽어나간다면 서버와 연결이 될때까지 기다렸다가 연결이 되면 다음 소스를 읽어 서버에 요청을 보내고 서버와의 작업이 끝나면 사용자의 입력을 받아 처리하게 될 것입니다. 다시 말하면 두 가지 작업이 동시에 따로따로 이루어져야 하는데 그러지 못하고 한 작업이 끝나면 또 다른 작업이 실행되고 그 작업이 끝나면 나머지 작업이 실행되는 불상사가 일어나게 될 것입니다. 그래서 통신 응용프로그램을 만들게 될 땐 서버와의 통신 작업과 별개로 동시에 사용자가 이 응용프로그램에서 다른 작업을 할 수 있도록 Thread를 이용하는 것입니다.


대부분의 서버는 하나의 서버가 하나의 클라이언트에서만 접속하는게 아니라 수 많은 클라이언트가 서버에 접속하도록 만들어져 있습니다. 그렇다면 서버 입장에서 봤을 때, 다중 클라이언트가 접속한 상황에서 여러 클라이언트들이 동시에 여러 작업을 하는 경우 작업을 하나씩 하나씩 순서대로 처리하는 것이 아니라 하나의 클라이언트가 접속하면 Thread를 추가로 하나 생성해서 각 클라이언트들이 수행하는 작업을 각각의 Thread 안에서 처리하게 해야하는 것입니다.
















전송할 데이터는 '페이로드(Payload)'라는 작은 단위로 나뉜다. 그리고 나누어진 페이로드는 통신에 필요한 정보가 들어간 '헤더(Header)'와 페이로드의 무결성을 보장하기 위한 '트레일러(Trailer)'를 붙여진다.  이렇게 만들어진 데이터는 헤더가 가지는 정보에 따라 또는 트레일러의 유무에 따라 '프레임(Frame)' 혹은 '패킷(Packet)'이라고 부른다. 수신받은 프레임이나 패킷들은 소켓을 통해 원본 데이터로 다시 만들어진다.







여기까지는 기본적인 TCP 통신에 대해 개념적인 접근이었습니다. 아래의 예제에서는 이러한 통신 과정을 Server는 파이썬으로, Client는 Android로 구현한 것입니다. 


사실 Client를 Java로 구현했다면 그냥 소켓을 생성하고 Thread를 이용해서 입출력을 수행하면서 바로 값을 보거나 화면을 변경할 수 있지만







'Web > Network' 카테고리의 다른 글

Java TCP/IP 통신 (1)  (0) 2016.10.07