OODP -> JAVA로 수업
소켓의 개념적인 내용은 OS 수업에서 가져왔다
0. Socket
소켓은 통신의 가장 바닥/기본(endPoint)라고 한다.
소켓은 IP주소와 port번호로 이루어져 있는데 이를 표기하면 아래와 같다
a Socket = <ip address>:<port #>
각 연결은 한 쌍의 소켓에 의해서 정의가 된다.
여기서 포트(Port)는 컴퓨터가 인식할 수 있는 logical contact point 이다.
컴퓨터는 0 ~ 65535 까지의 포트 번호를 가질 수 있다.
그런데 보통은, 1024 이하의 포트번호는 예약이 되어 있는데 http:80, ftp:21, telnet:23 등이 있다.
그래서 특별한 목적으로 포트번호를 지정하는 경우(보통 보안), 1024 이상의 포트 번호를 사용한다.
ex) nipa 포트번호 56XXX
1. Socket in Java
교수님 말씀으로는 자바에서 소켓프로그래밍이 C보다 훨씬 편하다고 한다.
서버는 결국 소켓을 열고 클라이언트에게 요청이 들어올 때까지 대기를 한다.
자바에서 사용하는 소켓 클래스는 2가지로, ServerSocket Class와, Socket Class이다.
ServerSocket은 연결을 위한 요청을 수용하고, Socket은 실제적인 통신을 담당한다.
서버 소켓은, 서버차원에서 endPoint로 열어놓는 소켓이다. 클라이언트는 소켓을 가지고 해당 소켓을 찾아오게 된다.
클라이언트가 서버소켓에 대응하는 <IP>,<Port #>을 가지고 소켓을 만들면 서버 소켓은 해당 리퀘스트를 요청한 소켓과 대응할 수 있는 소켓 오브젝트를 생성한다. 즉, 서버소켓은 요청만 처리할 뿐 직접 의사소통을 수행하는 것은 아니다.
ServerSocket class가 생성 된후, accept()를 하면 바인딩이 되듯 계속해서 기다리는 상태가 된다.
클라이언트 측에서 소켓을 만들면 커넥션이 되며 그때 ServerSocket.accept(); 는 Socket instance를 리턴해준다.
그 이후로는 각자 연결된 Socket을 가지고 서버간 통신을 수행한다.
여기까지가 소켓의 대략적인 개념이었다.
OOPD 수업에서, Socket Communication 을 시작하면서 프록시 패턴과 함께 공부하라고 하셨다.
< 프록시 패턴 >
다른 무언가와 이어지는 인터페이스 역할을 하는 클래스. (ex. 참조횟수 스마트 포인터)
실제로 컴퓨터를 두대 운용해서 하기에는 대부분이 컴퓨터가 많지 않기 때문에
터미널을 두개 띄워 놓고 실습을 했다.
2. Server의 활성화
서버의 역할을 수행하는 EchoServer class이다.
교재에 typo 오류가 있는데, 그부분은 검정색 글씨로 진하게 적어놨다.
서로 소통하기 위해서는 I/O 객체를 전부 연결된 소켓에서 받아와야 한다.
i. 서버소켓의 사용할 포트번호를 넘겨주어 ServerSocket class를 생성한다.
ii. 생성된 class의 accept() 메소드를 호출하여 client의 request를 대기한다. 이때, 서버는 block(bind?)이 되고 계속해서 대기동작을 수행한다.
위에서 설명한 상태에 놓인 서버의 모습이다. 시작 된후, ServerSocket을 생성하였고 request를 기다리면서 아무것도 하지 않는다.
3. Client 생성 및 소켓 연결
Client의 역할을 수행하는 EchoClient이다.
실행시킬 때, IP주소를 따로 지정하지 않으면 (실습환경인) localhost로 지정이 된다.
여기서 생성하는 socket 클래스는 위에서 개념설명에 있었던 socket = <IP 주소>:<Port #> 의 형식으로 Class instance를 생성한다. Server에서 열어놓은 지정된 포트 번호를 입력하고, IP 주소를 전달함으로 Socket instance를 얻는다.
이때 Socket instance를 생성함과 동시에 활성된 서버(EchoServer)에서 accept()로 대기중이던 ServerSocket.accept(); 이 수행되어 서버에도 Socket instance를 생성한다. 이때 생성된 Socket instance는 client와 connection이 되어있다.
Socket이 생성되면 각 서버는 통신을 위하여 I/O instance를 생성한다. 이때 inputStream과 OutputStream을 각각 connected Socket에서 얻어온다. 정상적으로 객체를 얻었으면 서버간 통신을 수행할 준비가 되었다.
위의 코드는 Client에 작성된 코드이다. 콘솔에는 어떠한 메세지를 보냈는지 출력하고, connected Socket을 통해 얻어낸 outputStream 객체에 print 명령을 사용한다. 지정된 iteration만큼 발신을 수행한 뒤에, 설정된 종료 키워드를 보낸다.
위의 코드는 Server에 작성된 코드이다. connected Socket을 통해 얻어낸 inputStream 객체에게 입력을 받아온다.
입력된 문자열을 단순히 다시 outputStream을 통해 client에게 다시 반환한다. 반환이 정상적으로 수행 된 후, 콘솔에 어떠한 메세지를 수신했는지 출력을 해준다.
약속된 종료 키워드가 오면 무한루프를 탈출하여 의사소통을 끝낸다. 활성화 되었던 소켓을 닫아버린다. 이 동작을 통해서 서버와 클라이언트간의 통신을 종료 시킨다.
위의 코드는 클라이언트에 작성된 코드이다. 동일하게, connected Socket을 통해 Stream으로 메세지를 읽어들인다.
아래의 영상은 실제로 코드가 어떻게 동작하는지를 보여주는 영상이다.
'무제 메모장' 카테고리의 다른 글
1.4 Operating System Structure and Operation (0) | 2021.04.11 |
---|---|
1.3 Computer System Architecture (0) | 2021.04.09 |
1.1 Chain of Responsibility Pattern (0) | 2021.04.06 |
1.2 Computer system organization and operation (0) | 2021.03.16 |
1.1 Definitions of operating system (0) | 2021.03.16 |