서버와 클라이언트의 통신 과정을 간단히 정리하면 다음과 같다.
5단계에 걸쳐 진행된다. 서버를 열고 열린 서버에 클라이언트가 연결을 요청해야 하므로 서버 파일을 실행한 후 클라이언트 파일을 실행해야 한다.
1. 서버와 클라이언트로 쓸 소켓 객체를 생성
서버와 클라이언트는 소켓 생성 자체는 동일하지만 생성 이후 동작에 따라 서버와 클라이언트의 역할을 수행하게 된다. 아래 코드에서도 변수명만 다른 것을 확인할 수 있다.
server_sock=socket(AF_INET, SOCK_STREAM)
client_sock=socket(AF_INET, SOCK_STREAM)
AF_INET : Address Family의 한 종류로, IPv4 인터넷 프로토콜을 사용한다는 의미이다.
SOCK_STREAM : TCP를 사용하겠다는 의미이다. UDP를 사용하려면 SOCK_DGRAM로 바꿔주면 된다.
2. 서버로 사용할 소켓에 연결하고자 하는 서버의 IP와 Port번호 값 부여
server_sock.bind((HOST, PORT))
HOST는 서버의 IP주소, PORT는 서버의 Port번호를 의미한다.
3. 서버 소켓을 클라이언트의 접근 요청을 기다리는 상태를 변경, 유지.
server_sock.listen()
listen()의 인수 값으로 서버 소켓이 외부 연결을 거부하기 전에 큐에 넣기 원하는 연결 요청의 최대 수가 들어가는데 아무런 값을 넣지 않으면 default 값이 들어간다.
4. 클라이언트에서 서버 소켓으로 접근 요청
client_sock.connect((Host,Port))
Host : 연결하고자 하는 서버의 IP주소, Port : 연결하고자 하는 서버의 Port 번호
5. 서버에서 해당 클라이언트의 접근을 허용
conn, addr = server_sock.accept()
accept() 메소드는 두 개의 값을 튜플 형태로 반환한다.
첫 번째 값(conn)은 소켓 객체인데 이는 서버에 연결 요청을 한 클라이언트는 별개의 객체이지만 동일한 구성을 가져 실질적으로 서버-클라이언트 통신을 구현하는 소켓이다.
두 번째 값(addr)도 튜플 형태로, 연결된 클라이언트의 주소 정보가 저장된다.
- addr[0] : 연결된 클라이언트의 ip 주소
- addr[1] : 연결된 클라이언트의 port 번호
위의 5단계를 거치면 서버와 클라이언트 간 통신을 위한 소켓 연결 세팅은 완료된다.
이제 이 둘간의 데이터 송수신을 정리해보겠다. 사실 데이터 송수신은 정리할 게 없다. 말 그대로 데이터를 보내고 받으면 끝이다. 위에서 말했듯 서버와 클라이언트 모두 동일한 소켓이기 때문에 사용하는 메소드와 과정도 동일하다.
SOCK.send(msg.encode())
소켓 통신을 할 때에는 데이터가 byte 형태로 전달되어야 한다. 따라서 사용자에게 입력받은 메시지(msg)를 byte 형태로 바꾸어주는 과정이 필요하다. 이를 인코딩(encoding)이라고 한다. encode() 메소드를 사용해주면 된다.
data=SOCK.recv(1024).decode()
인코딩의 반대 과정으로 byte를 String으로 바꾸어주는 디코딩(decoding) 과정을 거쳐 사용자에게 전달한다. decode() 메소드를 사용해주면 된다.
마지막으로 소켓 사용을 완료한 후 해당 소켓을 닫아준다.
server_sock.close()
'Knowledge' 카테고리의 다른 글
[VNC] 내 컴퓨터에서 원격 컴퓨터로 파일 옮기기 (0) | 2022.11.30 |
---|---|
[VNC] 라즈베리파이 화면 해상도 설정 (0) | 2022.11.30 |
URI와 웹 브라우저 요청 흐름 (0) | 2022.01.09 |
인터넷 네트워크 기본 (0) | 2022.01.07 |
네트워크와 소켓 (0) | 2021.08.22 |