Computer_Language/Python

[Python] 파이썬 소켓 서버 프로그래밍

Joo-Topia 2019. 11. 17. 11:54

나는 개발자가 되기에 아직 많이 부족하다는 것을 느끼고 조금 더 열심히 살기로 다짐했다.

오늘은 파이썬으로 에코 서버를 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("접속을 종료합니다.")

 

서버에 데이터를 전송하게 되면 에코 서버에서 동일한 데이터를 재 전송해준다. 빈 문자열을 송신하면 클라이언트 접속이 종료되도록 했다.

 

마무리


파이썬언어로 멀티 스레드 서버를 구현하기 위해 먼저 기본적인 소켓 통신 코드를 만들어봤다.

코드는 여기에 올려두었으며, 저장소에 많은 예제를 올려 둘 예정이다.