프로그래밍/Python

파이썬 소켓 프로그래밍 / 서버 프로그래밍 #1

배기니어 2021. 1. 28. 21:30

첫 번째 프로젝트에서 안드로이드 디바이스 간 데이터 통신을 할 수 있는 앱을 구현하려고 한다.

자세한 기능은 나중에 기술하도록 하고 먼저 데이터 통신을 위한 서버를 구현하려고 한다.

학교에서 컴퓨터 네트워크 시간에 배운게 전부라 자세하게는 잘 모르겠다. 그마저도 계절 학기로 짧게 배워서 기억이 잘 안난당.. 그래도 최대한 자세히 설명해보기로..

 

소스 코드는 맨 아래에 있어유

 

그림 1. 소켓 통신의 실행 흐름

소켓 통신의 flowchart는 위의 그림과 같다.

서버가 있어야 클라이언트가 접속을 할 수 있으니 서버 측면에서 먼저 살펴보도록 하자.

서버에서 소켓을 생성하고, 소켓에 ip와 port를 주소로 하여 bind한다. 여기서 bind란 결합 혹은 할당 정도로 생각하면 좋을 것 같다. 그리고 서버에서는 클라이언트의 연결을 대기한다. 여기까지가 서버 생성 및 실행의 단계로 보면 된다.

 

이후 서버에서 데이터가 오고 가기 위해서는 클라이언트가 있어야 한다. 클라이언트도 마찬가지로 소켓을 이용한다.

먼저 클라이언트 소켓을 생성한다. 그리고 서버에 소켓을 연결해야 하는데, 여기서 아까 서버 소켓에 사용된 ip와 port를 주소로 하여 서버를 찾아갈 수 있도록 한다. 서버가 생성되어 listen 상태에 있다면 연결이 가능하다.

 

# 요약

서버 :

1. 소켓 생성

2. 주소 결합

3. 클라이언트 연결 대기

 

클라이언트 :

1. 소켓 생성

2. 서버에 연결

 

이제 클라이언트는 서버에 접속할 수 있다!

 

 

이제 서버의 코드를 작성해보자. 서버 프로그래밍은 파이썬으로 한다.

먼저 소켓 생성을 위해 socket 라이브러리를 추가한다.

import socket

 

그리고 주소를 지정해야 한다.

내 pc의 ip주소는 윈도우 command 창에서 확인할 수 있다.

실행창 -> cmd 입력 -> ipconfig입력

 

그림 2. ip 주소 확인

위에 빨간 박스로 표시한 부분이 서버의 ip가 될 부분이다.

포트 번호는 임시로 지정하고 소켓을 생성하여 주소를 결합한다.

 

소켓 생성에서 socket.AF_INET은 소켓의 주소에 IPv4를 사용하겠다는 뜻이다. 우리가 위에서 확인한 ip 주소가 IPv4 주소이기 때문에 소켓 옵션을 위와 같이 설정한다. 주소를 소켓에 bind하기 위해서는 bind 메소드를 이용한다. 이때 주소를 tuple 형식으로 입력해야 한다.

그리고 listen 메소드로 클라이언트의 연결을 대기하는데, input은 최대로 연결할 수 있는 클라이언트의 수이다. 최대 동시접속자(?)라고 생각하면 될 것 같다.

host = '192.168.1.4'    # IP Address
port = 8080             # Port Number

server_sock = socket.socket(socket.AF_INET)
server_sock.bind((host, port))
server_sock.listen(1)

마지막으로 클라이언트의 접속 요청을 처리한다. 클라이언트가 접속을 시도하면 서버에서는 accept 메소드로 클라이언트 소켓과 연결한다. 클라이언트가 서버에 접속하면 서버에서는 클라이언트가 연결되었다는 메시지와 함께 클라이언트의 주소를 출력한다.

print("Waiting for connection...")
client_sock, addr = server_sock.accept()
print('Connected by', addr)

전체 코드는 다음과 같습니당

# server.py
import socket

host = '192.168.1.4'    # IP Address
port = 8080             # Port Number

server_sock = socket.socket(socket.AF_INET)
server_sock.bind((host, port))
server_sock.listen(1)

print("Waiting for connection...")
client_sock, addr = server_sock.accept()
print('Connected by', addr)

실행 결과

 

그림 3. 실행 결과

클라이언트 접속은 다음 글에서 다루겠읍니당

휴 글쓰는 게 더 어렵다