728x90
소켓
소켓은 연결된 네트워크의 양 끝단을 추상화 시킨 개념
컴퓨터의 관점에선 네트워크로 통하는 컴퓨터의 외부와 컴퓨터 내부의 프로그램을 이어주는 인터페이스
택배를 보낼 때 박스에 물건을 넣고 받는 사람 주소를 쓰는 것과 비슷하게
소켓은 어디로 보내지는 창구라는 것이 명시된 택배 상자 같은 것
소켓의 사용방법
1. 서버 소켓
from socket import * from select import * HOST ='' PORT = 10000 BUFSIZE = 1024 ADDR = (HOST, PORT) #소켓 객체 생성 serverSocket = socket(AF_INET, SOCK_STREAM) #소켓 주소 정보 할당 serverSocket.bind(ADDR) #연결 수신 대기 상태 serverSocket.listen(100) #연결 수락 clientSocket, addr_info = serverSocket.accept() print('connected by', addr) |
소켓 주소 정보 할당
AF_INET에서 ''는 INADDR_ANY를 의미한다. 즉, 모든 인터페이스와 연결하고 싶다면 빈 문자열을 넣으면 된다.
즉, 10000번 포트에서 모든 인터페이스에게 연결하도록 한다라는 의미
연결 수신 대기 상태
listen()안에 인자는 해당 소켓이 총 몇개의 동시접속까지 허용할 것인지 의미한다.
인자를 입력하지 않으면 파이썬이 자의적으로 판단해서 임의의 숫자로 listen한다고 한다.
연결 수락
접속을 수락하고 통신을 하기 위해서 accept를 사용한다.
누군가가 접속할 때까지 프로그램은 이 부분에서 멈춰있게 된다.
2. 클라이언트 소켓
from socket import * from select import * import sys from time import ctime HOST = '12.0.0.1' PORT = 10000 BUFSIZE = 1024 ADDR = (HOST, PORT) #서버에 접속하기 위한 소켓 생성 clientSocket = socket(AF_INET, SOCK_STREAM) #서버 접속 시도 clientSocket.connect(ADDR) |
bind, listen, accept이 없고 connect가 있다.
클라이언트에서 서버에 접속하기 위해서 connect()을 실행해주면 된다.
127.0.0.1은 자기 자신을 의미한다.
즉, 자기 자신에게 10000번 포트로 연결하라는 의미
3. 송수신
-클라이언트
msg = 'Hello!' #서버에 메시지 전달 clientSocket.send(msg.encode()) |
encode()는 문자열을 byte로 변환해주는 메소드이다.
-서버
data = clientSocket.recv(65535) print('recieve data : ', data.decode()) |
recv() 인자는 수신할 바이트의 크기로, 65535바이트 만큼 가져오겠다는 뜻이다.
send()를 실행 할때 인코딩해서 보냈으니 문자열로 보기 위해서는 디코딩을 해야한다.
예제 코드
-Server.py
from socket import * HOST = '127.0.0.1' PORT = 9999 ADDR = (HOST, PORT) serverSocket = socket(socket.AF_INET, socket.SOCK_STREAM) serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) serverSocket.bind(ADDR) serverSocket.listen() clientSocket, addr = serverSocket.accept() print('connected by', addr) copy = '0' while True: f = open('test.txt', 'r') s = f.read() f.close() if copy == s: continue else: print('메모장의 내용', s) copy = s clientSocket.sendall(s.encode()) clientSocket.close() serverSocket.close() |
-Client.py
from socket import * HOST = '127.0.0.1' PORT = 9999 ADDR = (HOST, PORT) clientSocket = socket(AF_INET, SOCK_STREAM) clientSocket.connect(ADDR) copy = '0' while True: data = clientSocket.recv(1024) if copy == data: continue else: print('서버로부터 받은 메모장의 내용', repr(data.decode())) copy = data f=open('testclient.txt', 'w') f.write(data.decode()) f.close() clientSocket.close() |
실행결과
728x90
반응형
'Software Study > 통신' 카테고리의 다른 글
Jinja2 사용하기 (0) | 2021.01.15 |
---|---|
파이썬으로 웹서버 구축하기 (Flask ) (0) | 2021.01.13 |