티스토리 뷰

select 함수를 이용한 간단한 에코 서버/클라이언트 예제이다



서버 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import select
import socket
import sys
 
ip = '127.0.0.1'
port = 55555
size = 1024
 
# 소켓생성
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 바인드
server.bind((ip, port))
# 리슨, 여기까지는 기본적인 서버 소켓 세팅
server.listen()
# select 함수에서 관찰될 소켓 리스트 설정
input_list = [server]
 
while True:
    # select 함수는 관찰될 read, write, except 리스트가 인수로 들어가며
    # 응답받은 read, write, except 리스트가 반환된다.
    # input_list 내에 있는 소켓들에 데이터가 들어오는지 감시한다.
    # 다르게 말하면 input_list 내에 읽을 준비가 된 소켓이 있는지 감시한다.
    input_ready, write_ready, except_ready = select.select(input_list, [], [])
 
    # 응답받은 read 리스트 처리
    for ir in input_ready:
        # 이건 무시 -ㅁ-
        # unix/linux의 경우 sys.stdin도 감시 가능함. 윈도우에서 테스트해서 에러남여
        if ir == sys.stdin:
            junk = sys.stdin.readline()
            print(junk, flush=True)
 
        # 클라이언트가 접속했으면 처리함
        elif ir == server:
            client, address = server.accept()
            print(address, 'is connected', flush=True)
            # input_list에 추가함으로써 데이터가 들어오는 것을 감시함
            input_list.append(client)
 
        # 클라이언트소켓에 데이터가 들어왔으면
        else:
            data = ir.recv(size)
            if data:
                print(ir.getpeername(), 'send :', data, flush=True)
                ir.send(data)
            # 데이터가 없는경우, 즉 클라이언트에서 소켓을 close 한경우
            else:
                print(ir.getpeername(), 'close', flush=True)
                ir.close()
                # 리스트에서 제거
                input_list.remove(ir)
 
server.close()
 
 
cs




클라이언트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import socket
 
ip = '127.0.0.1'
port = 55555
size = 1024
 
= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send("Hello".encode())
data = s.recv(size)
 
print(data.decode())
s.close()
 
cs


클라이언트 코드는 간단하다


그냥 접속해서 데이터 전송하고 다시 받고 stdout으로 출력한다





댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함