베지밀
[네트워크] 파이썬 socket 프로그래밍 실습 본문
실습 준비
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를 각각 서버와 클라이언트에 실행
기본적인 소켓 통신 코드는 형식이 정해져있기 때문에 저 템플릿을 크게 벗어나지 않음
네트워크 통신을 하는 프로그램이라면 무조건 소켓 프로그램이 코딩되어있다!!