나는 개발자가 되기에 아직 많이 부족하다는 것을 느끼고 조금 더 열심히 살기로 다짐했다.
오늘은 파이썬으로 에코 서버를 TCP타입 소켓 통신을 통해 만들었다.
코드와 함께 간단한 주석으로 설명을 대체할 것이다.
사실 진짜 만들고 싶었던 건 내가 계속되는 질문에도 답을 못 했었던 스레드를 이용한 서버이다.
이번 건 맛 보기라는 뜻이다!
서버 코드
import socket
host = "127.0.0.1"
port = 9123
#IPv4 체계, TCP 타입 소켓 객체를 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#포트를 사용 중 일때 에러를 해결하기 위한 구문
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#ip주소와 port번호를 함께 socket에 바인드 한다.
#포트의 범위는 1-65535 사이의 숫자를 사용할 수 있다.
server_socket.bind((host, port))
#서버가 클라이언트의 접속을 허용한다.
server_socket.listen()
#클라이언트 함수가 접속하면 새로운 소켓을 반환한다.
client_socket, addr = server_socket.accept()
print("접속한 클라이언트의 주소 입니다. : ", addr)
while 1:
string = client_socket.recv(1024).decode()
if string == "": break
print("받은 데이터는 \"", string, "\" 입니다.", sep="")
client_socket.sendall(string.encode())
# 소켓을 닫는다.
print("접속을 종료합니다.")
client_socket.close()
server_socket.close()
클라이언트에서 받은 데이터를 그대로 출력하고, 빈 문자열을 수신할 시 클라이언트 소켓, 서버 소켓을 순서대로 닫아준다. 위 코드는 한 개의 클라이언트에 대해서만 서비스를 진행하고 종료되는 서버이다.
클라이언트 코드
import socket
# 접속하고 싶은 서버의 주소를 입력한다.
# ip주소를 직접 입력할 수 도 있고 hostname도 입력 가능하다.
# host = '127.0.0.1'
host = "localhost"
# 접속하고 싶은 포트를 입력한다.
port = 9123
#IPv4 체계, TCP 타입 소켓 객체를 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 지정한 host와 prot를 통해 서버에 접속합니다.
client_socket.connect((host, port))
while 1:
string = input("서버에 보내고 싶은 데이터를 입력하세요. : ")
# 메시지 전송
client_socket.sendall(string.encode())
if string == "": break
# 메시지 수신
receive_data = client_socket.recv(1024)
print("받은 데이터는 \"", receive_data.decode(), "\" 입니다.", sep="")
# 소켓을 닫는다.
client_socket.close()
print("접속을 종료합니다.")
서버에 데이터를 전송하게 되면 에코 서버에서 동일한 데이터를 재 전송해준다. 빈 문자열을 송신하면 클라이언트 접속이 종료되도록 했다.
마무리
파이썬언어로 멀티 스레드 서버를 구현하기 위해 먼저 기본적인 소켓 통신 코드를 만들어봤다.
코드는 여기에 올려두었으며, 저장소에 많은 예제를 올려 둘 예정이다.
'Computer_Language > Python' 카테고리의 다른 글
[Python] 멀티 스레드 소켓 서버 구축하기 (0) | 2019.11.18 |
---|---|
[Python] 파이썬 eval 과 exec 함수에 대하여 (0) | 2019.10.04 |
[Python] 파이썬 리스트와 튜플의 차이 (0) | 2019.09.05 |
[Python] 파이썬 병렬 프로그래밍 모듈 (Multiprocessing 라이브러리) (1) | 2019.09.01 |