본문 바로가기

개발자 레니는 지금 -/소프트웨어와 함께

[ Python ] Select Module을 이용한 1:N TCP Socket 통신



Python

Select Module을 이용한 1:N

TCP Socket 통신








 시작 전 테스트환경 살피기

   Time

    2017년 08월 30일

   OS

    Virtual Box - Linux(Ubuntu 16.04 LTS)

   Language

    Python 2.7



Socket을 이용한 통신에는 Blocking 이라는 문제가 있다.


Blocking ?

어떤 일이 일어나기를 기다리면서 멍하니 있는 상태, 간단히 말해서 Server와 Client가 서로 데이터를 넘겨주기 만을 기다리는 상태가 된다는 것이다. 일정 시간 이 후 Timeout이 걸려서 Blocking 상태를 벗어나게 도와주는 것이 Select Module 이다.




Select Wathing for I/O completion




select.select( rlist, wlist, xlist[, timeout] )


rlist : 읽을 준비가 될 때 까지 기다린다.

wlist : 쓰기 위한 준비가 될 때 까지 기다린다.

xlist : 예외적인 조건을 기다린다.

[, timeout] : Blocking을 벗어나기 위한 시간.


앞의 3개의 인수( rlist, wlist, xlist )에 대한 값을 반환한다. but 지정한 Time이 지나면 앞의 세 인수( rlist, wlist, xlist )는 빈 list를 반환한다.



Client 주요 code


connection_list = [ sys.stdin, clientSocket ]

read_socket, write_socket, error_socket = select(connection_list, [], [], 10)



- select가 socket 전용 module이 아니라 I/O stream을 위한 module 이기에 입력을 위한 stream도 read_socket 부분에 같이 넣어주어야 Client Prompt 창 에서 입력을 받을 수 있다.

- 10초라는 의미 값을 전달 했기 때문에 읽어 들일 객체가 없으면 비어있는 리스트를 반환한다.



Server 주요 code


connection_list = [ serverSocket ]

read_socket, write_socket, error_socket = select(connection_list, [], [], 10)



- Server는 Prompt 창에서 별도의 입력을 필요하지 않고 Clinet가 던져주는 메시지를 받아 다시 응답하는 역할만 하기 때문에 connection_list에 sys.stdin 을 포함시키지 않았다.

- 10초라는 의미 값을 전달 했기 때문에 읽어 들일 객체가 없으면 비어있는 리스트를 반환한다.


Tip. 프로그램을 종료 할 때 강제종료를 하게 되는데 이때 KeyboardInterrupt Error가 발생하게 된다.







 Git HUB 해당 url로 들어가셔서 Download를 누르시면 전체 코드가 담긴 zip 파일이 생성됩니다.


Select Test.zip 



 참조내용


1. PYTHON SELECT EXAMPLE

2. The select Module

3. 파이썬 소켓(socket) 모듈을 사용한 네트워크 프로그래밍 - Python 도서 리뷰

4. 16.1. select — Waiting for I/O completion