안녕하세요 학습자 여러분! 이전 튜토리얼에서는 Python unittest 모듈에 대해 다뤘습니다. 오늘은 파이썬 소켓 프로그래밍 예제를 살펴보겠습니다. 파이썬 소켓 서버와 클라이언트 애플리케이션을 만들 것입니다.
파이썬 소켓 프로그래밍
파이썬 소켓 프로그래밍을 이해하기 위해 우리는 세 가지 흥미로운 주제에 대해 알아야 합니다 – 소켓 서버, 소켓 클라이언트 그리고 소켓. 그렇다면 서버란 무엇일까요? 서버는 클라이언트 요청을 기다리고 해당 요청을 처리하거나 제공하는 소프트웨어입니다. 반면, 클라이언트는 이 서비스를 요청하는 프로그램입니다. 클라이언트 프로그램은 서버에게 일부 리소스를 요청하고, 서버는 해당 요청에 응답합니다. 소켓은 서버와 클라이언트 간의 양방향 통신 채널의 끝점입니다. 소켓은 프로세스 내부, 동일한 컴퓨터의 다른 프로세스 간 또는 다른 컴퓨터의 프로세스 간에 통신할 수 있습니다. 원격 프로그램과의 통신을 위해서는 소켓 포트를 통해 연결해야 합니다. 이 소켓 프로그래밍 튜토리얼의 주요 목표는 소켓 서버와 클라이언트가 서로 어떻게 통신하는지 알려드리는 것입니다. 또한 파이썬 소켓 서버 프로그램을 작성하는 방법도 배우게 될 것입니다.
파이썬 소켓 예제
이전에 우리는 소켓 클라이언트가 소켓 서버에게 일부 리소스를 요청하고 서버가 해당 요청에 응답한다고 말했습니다. 그래서 우리는 서버와 클라이언트 모델을 설계하여 각각 통신할 수 있도록 할 것입니다. 다음과 같이 단계별로 고려할 수 있습니다.
- 파이썬 소켓 서버 프로그램은 먼저 실행되고 요청을 기다립니다.
- 파이썬 소켓 클라이언트 프로그램은 먼저 대화를 시작합니다.
- 그런 다음 서버 프로그램은 클라이언트 요청에 따라 응답합니다.
- 사용자가 “bye” 메시지를 입력하면 클라이언트 프로그램이 종료됩니다. 서버 프로그램은 클라이언트 프로그램이 종료될 때 종료됩니다. 이는 선택 사항이며, 서버 프로그램을 계속 실행하거나 클라이언트 요청의 특정 명령으로 종료할 수 있습니다.
파이썬 소켓 서버
우리는 python 소켓 서버 프로그램을 socket_server.py
로 저장할 것입니다. Python 소켓 연결을 사용하기 위해 socket 모듈을 가져와야 합니다. 그런 다음, 서버와 클라이언트 간의 연결을 설정하기 위해 일련의 작업을 순차적으로 수행해야 합니다. socket.gethostname()
함수를 사용하여 호스트 주소를 얻을 수 있습니다. 포트 번호는 1024보다 큰 값을 사용하는 것이 좋습니다. 왜냐하면 1024보다 작은 포트 번호는 표준 인터넷 프로토콜에 예약되어 있기 때문입니다. 아래의 python 소켓 서버 예제 코드를 참조하십시오. 주석을 통해 코드를 이해하는 데 도움이 될 것입니다.
import socket
def server_program():
# 호스트 이름 가져오기
host = socket.gethostname()
port = 5000 # initiate port no above 1024
server_socket = socket.socket() # get instance
# 주의깊게 보세요. bind() 함수는 튜플을 인수로 사용합니다
server_socket.bind((host, port)) # bind host address and port together
# 서버가 동시에 수신할 수 있는 클라이언트 수를 구성합니다
server_socket.listen(2)
conn, address = server_socket.accept() # accept new connection
print("Connection from: " + str(address))
while True:
# 데이터 스트림 수신. 1024바이트보다 큰 데이터 패킷은 수신하지 않습니다
data = conn.recv(1024).decode()
if not data:
# 데이터가 수신되지 않으면 중단
break
print("from connected user: " + str(data))
data = input(' -> ')
conn.send(data.encode()) # send data to the client
conn.close() # close the connection
if __name__ == '__main__':
server_program()
따라서 우리의 python 소켓 서버는 5000번 포트에서 실행되며 클라이언트 요청을 기다립니다. 클라이언트 연결이 닫힐 때 서버가 종료되지 않도록하려면 if 조건과 break 문을 제거하십시오. Python while 루프는 서버 프로그램을 계속 실행하고 클라이언트 요청을 기다리기 위해 사용됩니다.
Python 소켓 클라이언트
파이썬 소켓 클라이언트 프로그램을 socket_client.py
로 저장할 것입니다. 이 프로그램은 서버 프로그램과 비슷하지만 바인딩은 제외됩니다. 서버 프로그램과 클라이언트 프로그램의 주요 차이점은 서버 프로그램에서 호스트 주소와 포트 주소를 함께 바인딩해야 한다는 것입니다. 아래의 파이썬 소켓 클라이언트 예제 코드를 참조하면 코드를 이해하는 데 도움이 될 것입니다.
import socket
def client_program():
host = socket.gethostname() # as both code is running on same pc
port = 5000 # socket server port number
client_socket = socket.socket() # instantiate
client_socket.connect((host, port)) # connect to the server
message = input(" -> ") # take input
while message.lower().strip() != 'bye':
client_socket.send(message.encode()) # send message
data = client_socket.recv(1024).decode() # receive response
print('Received from server: ' + data) # show in terminal
message = input(" -> ") # again take input
client_socket.close() # close the connection
if __name__ == '__main__':
client_program()
파이썬 소켓 프로그래밍 출력
출력을 확인하려면 먼저 소켓 서버 프로그램을 실행한 다음 소켓 클라이언트 프로그램을 실행하십시오. 그런 다음 클라이언트 프로그램에서 무언가를 작성하십시오. 그런 다음 다시 서버 프로그램에서 응답을 작성하십시오. 마지막으로 클라이언트 프로그램에서 bye를 작성하여 두 프로그램을 종료하십시오. 아래의 짧은 비디오에서는 소켓 서버와 클라이언트 예제 프로그램의 테스트 실행 내용을 보여줍니다.
pankaj$ python3.6 socket_server.py
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
-> Hello
from connected user: How are you?
-> Good
from connected user: Awesome!
-> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py
-> Hi
Received from server: Hello
-> How are you?
Received from server: Good
-> Awesome!
Received from server: Ok then, bye!
-> Bye
pankaj$
참고로 소켓 서버는 포트 5000에서 실행되지만 클라이언트도 서버에 연결하기 위해 소켓 포트가 필요합니다. 이 포트는 클라이언트 연결 호출에 의해 임의로 할당됩니다. 이 경우에는 57822입니다. 그러므로 파이썬 소켓 프로그래밍, 파이썬 소켓 서버 및 소켓 클라이언트 예제 프로그램에 대한 설명은 여기까지입니다. 참고 문헌: 공식 문서
Source:
https://www.digitalocean.com/community/tutorials/python-socket-programming-server-client