Python-Socket
Python Socket
TCP 서버/클라이언트 함수 호출 관계
그림 출처:젤리 블로그
TCP 서버/클라이언트 함수 호출 순서
- 서버, 클라이언트 소켓 생성
- 서버는 bind(), listen()함수를 호출하여 대기 상태
- 클라이언트는 connect()함수 호출을 통해 연결 요청
- 서버는 accept()함수를 통해 연결 수락
- 서버와 클라이언트는 서로 연결
- close()함수를 통해 연결 종료
Socket 함수
명령어 | 설명 |
socket() | 소켓 생성 |
bind() | 생성한 socket을 server socket 으로 등록 |
listen() | server socket을 통해 클라이언트의 접속 요청을 확인하도록 설정 |
accept() | 클라이언트 접속 요청 대기 및 허락 클라이언트와 통신을 위해 새 socket생성 |
read(),wirte() | client socket으로 데이터를 송수신 |
close() | client socket을 소멸 |
Server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#soc1_server.py
#<컴퓨터 간 접속상태 확인을 위해 1회 접속처리>
from socket import *
# TCP/IP socket
serverSock = socket(AF_INET, SOCK_STREAM)
serverSock.bind(("127.0.0.1", 9999))
serverSock.listen(1) #리스너 설정 1~5
print("server service 중 ...")
conn, addr = serverSock.accept()
print("client address: ", addr)
print("from client message: ", conn.recv(1024).decode())
conn.close()
serverSock.close()
Client
1
2
3
4
5
6
7
8
#soc1_client.py
from socket import *
clientSock = socket(AF_INET, SOCK_STREAM) #소켓의 종류와 유형 선언, 가장 일반적인 모습
clientSock.connect(("127.0.0.1", 9999))
clientSock.sendall("안녕!".encode(encoding="utf-8", errors="strict"))
clientSock.close()
실행 결과
Python Echo Server
클라이언트가 전송해주는 데이터를 그래도 되돌려 전송해 주는 기능의 서버
Server
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
#soc2_server.py
#echo server 사용
import socket
import sys
HOST = ""
PORT = 8888
serverSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
serverSock.bind((HOST, PORT))
#HOST에 IP를 별도로 주지 않는다면 동적이 된다.
print("서버 서비스 중입니다.")
serverSock.listen(5) # 동시 최대 접속 수=5
#서버는 무한루프에 빠져있다.
while True:
conn, addr = serverSock.accept()
print("client info: ", addr[0], addr[1])
#IP주소와 포트번호를 따로 받겠다는 의미
print("from client message: ", conn.recv(1024).decode())
#송신
conn.send(("from server: " + str(addr[1]) + \
"너도 잘 지내라").encode("utf-8"))
# \ -> 명령이 계속 이어진다는 의미
except Exception as e:
print("err: ", e)
sys.exit() #프로그램 강제종료
finally:
serverSock.close()
conn.close()
Client
1
2
3
4
5
6
7
8
9
10
11
12
13
#soc2_client.py
from socket import *
clientSock = socket(AF_INET, SOCK_STREAM) #소켓의 종류와 유형 선언, 가장 일반적인 모습
clientSock.connect(("127.0.0.1", 8888))
clientSock.sendall("스승의 은혜는 하늘 같아서 . . .".encode(encoding="utf-8", errors="strict"))
#errors="strict" -> 줘도, 안줘도 된다.
re_message = clientSock.recv(1024).decode()
print("수신자료: ", re_message)
clientSock.close()
실행 결과
참조:원본코드
코드에 문제가 있거나 궁금한 점이 있으면 wjddyd66@naver.com으로 Mail을 남겨주세요.
Leave a comment