베지밀

[네트워크] 파이썬 socket 프로그래밍 실습 본문

개인 공부/네트워크

[네트워크] 파이썬 socket 프로그래밍 실습

vegimil 2024. 7. 25. 11:11

실습 준비

1. https://day-night.tistory.com/119 에서 1번 컨테이너 생성

서버 / 클라이언트 컨테이너를 생성하고 VSCode로 각각 열기

 

2. 서버와 클라이언트 둘 다 python3 설치

apt update
apt install python3

 

socket은 파이썬 기본 모듈이기 때문에 python3을 설치하고 import하면 됨.

 

접속 정보

server ip : 172.17.0.2
server port : 8001

client ip : 172.17.0.3
client port : 8002

 

 

Python Socket으로 전송하고 nc로 받기

1. nc를 사용해서 서버 대기

server# nc -l -p [서버 포트]

 

 

2. client에서 send.py로 소켓 생성

import socket

print("send start...")
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect(("172.17.0.2", 8001))

data_to_send = b"Hello!\n"
client_socket.send(data_to_send)

exit()

서버에게 Hello를 보내는 코드

클라이언트 측에서 작성해야 하고, 서버 ip, 서버 port를 사용

 

 

3. 소켓 코드 실행

좌 서버 우 클라이언트

 

 

nc로 전송하고 python socket으로 받기

1. client에서 recv.py로 통신 대기

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("0.0.0.0", 8002))
server_socket.listen(1)

print("Listening ...")

client_socket, client_address = server_socket.accept()
print("Connection Accepted!")

data = client_socket.recv(1024)

print(f"Received data: {data.decode('utf-8')}")
client_socket.close()

client에서 작성 후 실행

0.0.0.0 : 인터넷 상의 모든 ip주소로부터 연결을 허용하겠다는 의미

8002 : 소켓을 연결할 포트. 8002번으로 들어오는 통신은 모두 이 소켓(recv.py의 server_socket)이 가져가게 될 것

 

 

2. 서버에서 nc를 통해 연결

server# nc 172.17.0.3 8002

클라이언트의 ip와 포트번호로 nc연결을 시도

 

서로 연결된 것을 확인할 수 있다.

 

* 만약 Already in use라는 에러가 뜨면 해당 포트번호가 사용중인 것이므로

포트번호를 바꾸거나, netstat으로 포트 번호를 검색 후 kill해주면 된다.

 

Python Socket끼리 통신하기

서버와 클라이언트 측에서 socket 프로그래밍을 통해 통신할 수도 있다.

위에서 작성한 recv.py와 send.py를 각각 서버와 클라이언트에 실행

 

 

기본적인 소켓 통신 코드는 형식이 정해져있기 때문에 저 템플릿을 크게 벗어나지 않음

네트워크 통신을 하는 프로그램이라면 무조건 소켓 프로그램이 코딩되어있다!!