개요
TCP와 UDP의 전송 방식이 다른것처럼, 소켓통신에도 방식이 다르다. 데이터 타입은 TCP는 Stream 방식이고 UDP는 Datagram 방식이다.
본 문서에서는 클라이언트와 서버를 만들어 TCP/UDP Socket 통신을 구현한다.
send me email if you have any questions.
TCP Socket
TCP Socket 통신 과정
- 서버에서 소켓을 열고 클라이언트의 연결 요청 대기.
- 클라이언트에서 소켓을 열고 서버에 연결 요청.
- 서버에서 클라이언트의 소켓 연결 요청을 수락.
- 데이터 송/수신
Server code
from socket import *
host = "127.0.0.1" ### 사용할 임의 IP와 Port를 지정한다.
port = 7001
serverSocket = socket(AF_INET, SOCK_STREAM) ### TCP 소켓을 지정한다 (STREAM)
serverSocket.bind((host,port)) ### IP,Port Mapping
serverSocket.listen(1) ### 최대 연결 수를 지정한다
print("Waiting for Connection..")
connectionSocket,addr = serverSocket.accept()
print(str(addr),"by Connetcion..")
data = connectionSocket.recv(1024) ### 수신할 데이터 크기
print("Server : Data Received :", data.decode("utf-8"))
connectionSocket.send("Hello, i'm server!".encode("utf-8")) ### 데이터 송신
serverSocket.close()
- socket(AF_INET, SOCK_STREAM) : 소켓 객체를 만든다.
- socket.bind(address) : 만들어진 서버 소켓을 호스트 IP 및 Port를 튜플 형태로 맵핑한다.
- socket.listen() : 요청 대기 상태를 설정한다,.
- socket.accept() : 요청이 연결되면 소켓을 반납한다.
- socket.send(byte) or socket.sendall(byte) : 데이터 송신
- socket.recv(bufsize) : 데이터 수신 (bufsize는 한번에 수신되는 데이터 크기이다)
- socket.close() : 연결 종료
Client code
from socket import *
ip = "127.0.0.1"
port = 7001
clientSocket = socket(AF_INET, SOCK_STREAM) ### TCP 소켓을 지정한다 (STREAM)
clientSocket.connect((ip,port)) ### IP,Port Mapping
print("Connection Success..")
clientSocket.send("Hello, i'm client!".encode("utf-8")) ### 데이터 송신
data = clientSocket.recv(1024) ### 수신할 데이터 크기
print("Client : Data Received : ",data.decode("utf-8"))
clientSocket.close()
- socket.connect(address) : IP를 튜플형태로 지정해, 서버소켓에 연결한다.
- socket.send(byte) or socket.sendall(byte) : 데이터 송신
- socket.recv(bufsize) : 데이터 수신 (bufsize는 한번에 수신되는 데이터 크기이다)
UDP Socket
UDP Socket 통신 과정
- 서버/클라이언트 모두 소켓을 연다.
- 클라이언트에서 서버 호스트의 포트로 데이터전송
- 서버에서 생성된 데이터그램을 읽어 소켓을 이용해 클라이언트 호스트와 포트로 반환
- 클라이언트에서 소켓으로 받은 데이터그램을 읽어 값을 획득
Server code
from socket import *
sock = socket(AF_INET, SOCK_DGRAM) ### UDP 소켓을 지정한다 (DGRAM)
sock.bind(('127.0.0.1',7001)) ### IP 포트번호 지정
data, addr = sock.recvfrom(200) ### 데이터 수신 대기 (크기)
sock.sendto(data, addr) ### 데이터를 클라이언트에 송신
sock.close()
- socket(AF_INET, SOCK_DGRAM) : 소켓 객체를 만든다. (Diagram)
- socket.bind(address) : 만들어진 서버 소켓을 호스트 IP 및 Port를 튜플 형태로 맵핑한다.
- sock.recvfrom() : 데이터 수신대기를 한다.
- data.decode() : Client에서 문자데이터를 보낸다면 bytes type으로 메시지가 오게 되는데 받은 메시지를 출력하고 싶다면 받은문자열.decode()를 통해 decoding 해주어야한다.
- socket.close() : 연결 종료
Client code
from socket import *
sock = socket(AF_INET, SOCK_DGRAM) ### UDP 소켓을 지정한다 (DGRAM)
sock.sendto("Hello!".encode(), ('127.0.0.1',7001)) ### 데이터 송신
data, addr = sock.recvfrom(200) ### Server로 부터 수신한 데이터와 주소
print(data.decode(), addr)
- socket(AF_INET, SOCK_DGRAM) : 소켓 객체를 만든다. (Diagram)
- socket.bind(address) : 만들어진 서버 소켓을 호스트 IP 및 Port를 튜플 형태로 맵핑한다.
- sock.recvfrom() : 데이터 수신대기를 한다.
- data.decode() : Client에서 문자데이터를 보낸다면 bytes type으로 메시지가 오게 되는데 받은 메시지를 출력하고 싶다면 받은문자열.decode()를 통해 decoding 해주어야한다.
- socket.close() : 연결 종료
참고
PREVIOUSUni, Broad, Multi, Anycast