Erlang

[Erlang] Server/Client

메롱씨티 배드맨 2012. 2. 6. 18:10



당췌 이해가 잘 안가는 참 오묘하고도 신기한 랭귀지인 Erlang 

뭐 어쨌건, Erlang의 장점은 네트웍 및 다중 프로세서 생성이 아닌가 싶다.


예전 ACE Frame을 사용하면서 네트웍 구성이 참 간단하다고 생각했는데, Erlang은 더 간단하다.

Single Connection후 한번씩 데이터를 주고받는 Server-Client 예제이다.



1. Single Connection Server



start_nano_server() 로 서버를 시작하게 되면 첫번째 노란 라인의 {ok, Listen}에서 접속을 대기하고 있다.

Listen은 C에서 setsockopt() 와 같은 socket 옵션을 Listen과 동시에 설정한다.

- 맨처음 나오는 23456이 Open할 Port 번호이다.

- binary 이진모드로 전송

- packet은 header앞에 붙일 데이터 사이즈라고 하는데, 저걸 왜 붙여야 하는지 모르겠다..

- reuseaddr 은 서버가 socket을 반환할 경우 즉시 재시작 가능하도록 하는 옵션, 

- active 는 non-blocking 모드로 설정한다.

Client에서 접속을 요청하면 바로 아래 accept를 호출한다.

이후 Listen을 accept한 socket은 다른 요청을 수신하지 못하도록 close 한다.


( 다른 언어처럼 Read/Write 등의 네트웍 이벤트를 감지할 파일 생성 및 맵핑 과정이 Erlang에서는 내부에서 자동으로 처리되는듯 하다. )


이후 Loop 에서 데이터를 수신한다. 

Loop는 데이터를 한번 수신하고 바로 Close하도록 구성되어 있다.

만약 수신 에러가 발생한다면 { Error, Why } 가 발생하지만 여기서는 그냥 무시한다.

수신한 데이터는 binary_to_term함수를 통해 term으로 전송한 데이터를 풀고 format 함수로 화면에 프린트 한다.

이후 {"reply"} 라는 데이터를 client에게 전송한다.



2. Single Connection Client



Server에 접속하는 Client이다.

client는 nano_client_eval() 함수로 시작한다.

함수가 시작되면 connect 함수로 server에 접속을 시도한다.

- 접속할 서버의 주소

- 접속할 서버의 Port 번호

- 패킷의 종류의 헤더에 붙일 packet 사이즈

접속한 이후 바로 Str을 term으로 변환하여( term_to_binary ) 서버로 전송한다. Str은 nano_client_eval 함수 호출시 인자로 받는다.


전송후에 Server의 응답을 기다린다.

수신한 Server의 데이터는 (역시 term_to_binary 로 전달되었기 때문에.. ) bianry_to_term으로 변환하여 화면에 프린트 한다.


일단 뭔가 프로그램 개발을 시작하기 전에 (우리가 Hello World 수준은 아니잖아..) 이런 기초적인 테스트로부터 시작해본다.