Python 의 소켓 프로 그래 밍 을 분석 합 니 다.
소켓 은 네트워크 의 기초 이다.그것들 은 두 개의 서로 다른 프로그램 이나 장치 사이 의 정보 전송 을 가능 하 게 한다.예 를 들 어 브 라 우 저 를 열 때 클 라 이언 트 로 서 서버 와 연결 하여 정보 전송 을 하고 있 습 니 다.
이런 통신 을 깊이 연구 하기 전에 우 리 는 먼저 이 콘센트 들 의 정확 한 의 미 를 알 아 보 자.
이니셜
일반적으로 소켓 은 데 이 터 를 보 내 고 받 기 위 한 내부 점 이다.하나의 네트워크 는 통신 장치 나 프로그램 마다 두 개의 소켓 을 가지 게 될 것 이다.이 소켓 들 은 IP 주소 와 포트 의 조합 이다.사용 하 는 포트 번호 에 따라 하나의 장 치 는 n 개의 슬롯 을 가 질 수 있다.서로 다른 포트 는 서로 다른 유형의 프로 토 콜 에 사용 할 수 있 습 니 다.일반적인 포트 번호 와 관련 프로 토 콜 에 대한 더 많은 정 보 를 얻 기 위해 아래 그림 을 보십시오.
이제 소켓 의 개념 을 알 게 되 었 습 니 다.Python 의 Socket 모듈 을 보 여 드 리 겠 습 니 다.
3.어떻게 Python 에서 Socket 프로 그래 밍 을 실현 합 니까?
Python 을 사용 하여 Socket 프로 그래 밍 을 실현 하려 면 socket 모듈 이나 프레임 워 크 를 가 져 와 야 합 니 다.이 모듈 은 소켓 을 만 들 고 서로 연결 하 는 데 필요 한 내장 방법 으로 구성 되 어 있다.
몇 가지 중요 한 방법 은 다음 과 같다.
소켓 모듈 의 중요성 을 알 고 있 으 니 Python 의 소켓 프로 그래 밍 에 서버 와 클 라 이언 트 를 만 드 는 방법 을 계속 살 펴 보 겠 습 니 다.
서버
서버 는 프로그램,컴퓨터 또는 네트워크 자원 을 관리 하 는 장치 일 수 있 습 니 다.서버 는 같은 장치 나 컴퓨터 에서 도 로 컬 에서 다른 장치 와 컴퓨터 에 연결 할 수 있 고 원 격 으로 연결 할 수 있다.데이터베이스 서버,네트워크 서버,인쇄 서버 등 다양한 종류의 서버 가 있 습 니 다.
서버 는 보통 socket.socket(),socket.bid(),socket.listen()등 방법 으로 연결 을 만 들 고 클 라 이언 트 에 연결 합 니 다.이제 서버 를 만 들 기 위 한 프로그램 을 만 듭 시다.다음 예 시 를 고려 해 보 자.
예:
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(),1234))
#port number can be anything between 0-65535(we usually specify non-previleged ports which are > 1023)
s.listen(5)
while True:
clt,adr=s.accept()
print(f"Connection to {adr}established")
#f string is literal string prefixed with f which
#contains python expressions inside braces
clt.send(bytes("Socket Programming in Python","utf-8 ")) #to send info to clientsocket
보시 다시 피 소켓 을 만 드 는 첫 번 째 필수 조건 은 소켓 모듈 을 가 져 오 는 것 입 니 다.이후 socket.socket()방법 으로 서버 엔 드 소켓 을 만 듭 니 다.NOTE:
AF_INET 는 인터넷 의 주 소 를 말 합 니 다.한 쌍(호스트,포트)이 필요 합 니 다.그 중에서 호스트 는 특정한 사이트 의 URL 이나 주소 일 수 있 고 포트 번 호 는 정수 입 니 다.SOCK_STREAM 은 TCP 프로 토 콜 을 만 드 는 데 사 용 됩 니 다.
bid()방법 은 두 개의 인 자 를 원 그룹(호스트,포트)으로 받 아들 입 니 다.그러나 보통 작은 포트 번 호 를 차지 하기 때문에 4 자리 숫자의 포트 번 호 를 사용 하 는 것 이 좋다.listen()방법 은 서버 가 연결 을 받 아들 일 수 있 도록 합 니 다.여기 서 5 는 여러 연결 이 동시에 나타 나 는 대기 열 입 니 다.이 곳 에서 지정 할 수 있 는 최소 값 은 0 입 니 다.(작은 값 을 제공 하면 0 으로 변경 합 니 다.)매개 변 수 를 지정 하지 않 으 면 기본 적 인 매개 변 수 를 사용 합 니 다.
while 순환 에 서 는 연결 을 영원히 받 아들 일 수 있 습 니 다."clt 와 adr 는 클 라 이언 트 대상 과 주소 입 니 다.print 문 구 는 클 라 이언 트 소켓 의 주소 와 포트 번호 만 인쇄 합 니 다.마지막 으로,clt.send 는 바이트 데 이 터 를 보 내 는 데 사 용 됩 니 다.
현재 우리 의 서버 는 이미 준비 가 다 되 었 으 니,우 리 는 계속 클 라 이언 트 로 전진 합 시다.
클 라 이언 트
클 라 이언 트 는 서버 에서 정보 나 서 비 스 를 받 는 컴퓨터 나 소프트웨어 입 니 다.클 라 이언 트 서버 모듈 에서 클 라 이언 트 가 서버 에서 서 비 스 를 요청 합 니 다.가장 좋 은 예 는 구 글 크롬,파이 어 폭 스 등 웹 브 라 우 저 입 니 다.이 웹 브 라 우 저 들 은 웹 서버 에 사용자 가 지시 하 는 웹 페이지 와 서 비 스 를 요청 합 니 다.기타 예 는 온라인 게임,온라인 채 팅 등 을 포함한다.
이제 Python 프로 그래 밍 언어 로 클 라 이언 트 프로그램 을 만 드 는 방법 을 보 여 줍 니 다.
예:
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 2346))
msg=s.recv(1024)
print(msg.decode("utf-8"))
첫 번 째 단 계 는 플러그 인 모듈 을 가 져 오고 플러그 인 을 만 드 는 것 입 니 다.서버 를 만 들 때 와 같 습 니 다.그리고 클 라 이언 트-서버 사이 에 연결 을 만 들 려 면 지정(호스트,포트)을 통 해 connect()방법 을 사용 해 야 합 니 다.메모:클 라 이언 트 와 서버 가 같은 컴퓨터 에 있 을 때 gethostname 을 사용 합 니 다.(LAN C 로 컬 IP/WAN C 공용 IP)
여기 서 클 라 이언 트 는 서버 에서 정 보 를 받 기 를 원 합 니 다.이 를 위해 recv()방법 을 사용 하고 이 정 보 는 다른 변수 msg 에 저장 해 야 합 니 다.전달 하 는 정 보 는 바이트 단위 이 고 상기 프로그램의 클 라 이언 트 에서 한 번 전송 하면 최대 1024 개의 바이트(버퍼 크기)를 받 을 수 있다 는 것 을 기억 하 십시오.임 의 수량 을 지정 할 수 있 으 며,구체 적 으로 전송 하 는 정 보 량 에 달 려 있다.
마지막 으로 전송 중인 메 시 지 는 디 코딩 과 인쇄 를 해 야 합 니 다.
클 라 이언 트-서버 프로그램 을 만 드 는 방법 을 알 고 있 으 니 어떻게 실행 하 는 지 계속 보 겠 습 니 다.
5.1、Echo Client-Server
이 프로그램 을 실행 하려 면 명령 프롬프트 를 열 고 클 라 이언 트 와 서버 프로그램 을 만 든 폴 더 에 들 어가 서 입력 하 십시오.
py server.py(여기 서 server.py 는 서버 의 파일 이름 입 니 다.py-3.7 server.py 를 사용 할 수 있 습 니 다)
이 작업 이 완료 되면 서버 가 실 행 됩 니 다.클 라 이언 트 를 실행 하려 면 다른 cmd 창 을 열 고 입력 하 십시오:
py client.py(여기,client.py 는 클 라 이언 트 의 파일 이름)
출력(서버):
(고객)
버퍼 크기 를 7 로 줄 여 같은 프로그램 을 시도 한 다음 에 우리 가 어떤 출력 을 얻 었 는 지 봅 시다.
출력:
보시 다시 피 연결 은 7 개의 바이트 전송 후 종 료 됩 니 다.그러나 이것 은 문제 입 니 다.완전한 정 보 를 받 지 못 했 고 연결 이 닫 혔 기 때 문 입 니 다.이 문 제 를 계속 해결 합 시다.
5.2、Multiple Communications
클 라 이언 트 가 완전한 정 보 를 받 을 때 까지 연결 을 지속 하기 위해 while 순환 을 사용 할 수 있 습 니 다.
예:
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 2346))
while True:
msg=s.recv(7)
print(msg.decode("utf-8"))
이 작업 을 완료 하면 전송 할 때마다 7 바이트 로 전체 메 시 지 를 받 습 니 다.하지만 이번 에는 보시 다시 피 연결 이 종료 되 지 않 습 니 다.언제 연결 이 될 지 모 릅 니 다.그 밖 에 클 라 이언 트 가 서버 에서 받 을 메시지 나 정보 가 얼마나 큰 지 실제로 모 르 면 어떻게 해 야 합 니까?이러한 상황 에서 귀 하 는 실제 클 라 이언 트 에서 다음 과 같은 코드 를 사용 할 수 있 습 니 다.
예:
complete_info=''
while True:
msg = s.recv(7)
if len(msg)<=0:
break
complete_info += msg.decode("utf-8")
print(complete_info)
서버 에서 close()방법 을 사용 하면 다음 과 같 습 니 다.
clt.close()
출력 은 다음 그림 과 같 습 니 다:출력:
위의 코드 블록 이 하 는 모든 작업 은 정보의 크기 를 검사 하고 한 번 에 두 바이트 의 버퍼 에 인쇄 한 다음 연결 이 끝 난 후에 닫 는 것 입 니 다.
6.파 이 썬 대상 전송
여기까지 만 문자열 을 전송 하 는 노하우 가 생 겼 습 니 다.그러나 Python 의 소켓 프로 그래 밍 도 Python 대상 을 전송 할 수 있 습 니 다.이 대상 들 은 집합,원조,사전 등 모든 대상 이 될 수 있다.이 목적 을 실현 하려 면 Python 의 pickle 모듈 을 가 져 와 야 합 니 다.
6.1,Python pickle 모듈
실제 python 에서 직렬 화 되 거나 반 직렬 화 된 대상 이 있 을 때 Python pickle 모듈 이 나타 납 니 다.작은 예 를 보 여 주세요.
예:
import pickle
mylist=[1,2,'abc']
mymsg = pickle.dumps(mylist)
print(mymsg)
출력:b'x80x03] qx00(Kx01Kx02Xx03x00x00x00abcqx01e。
보시 다시 피 위의 프로그램 에서 pickle 모듈 의 dumps()함 수 를 사용 하여'my list'를 직렬 화 하 였 습 니 다.출력 이'b'로 시작 되 는 것 은 바이트 로 바 뀌 었 음 을 의미 합 니 다.소켓 프로 그래 밍 에서 이 모듈 은 클 라 이언 트 와 서버 사이 에 python 대상 을 전송 할 수 있 습 니 다.
6.2 pickle 모듈 을 사용 하여 python 대상 구 조 를 전달 하 는 방법
김 치 를 소켓 과 함께 사용 할 때 인터넷 을 통 해 모든 내용 을 전송 할 수 있 습 니 다.서버 쪽 과 클 라 이언 트 대응 항목 을 적어 서 서버 에서 클 라 이언 트 로 목록 을 전송 합 니 다.
서버 쪽:
import socket
import pickle
a=10
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 2133)) #binding tuple
s.listen(5)
while True:
clt , adr = s.accept()
print(f"Connection to {adr}established")
m={1:"Client", 2:"Server"}
mymsg = pickle.dumps(m) #the msg we want to print later
mymsg = {len(mymsg):{a}}"utf-8") + mymsg
clt.send(mymsg)
여기 서 m 는 사전 입 니 다.기본적으로 python 대상 이 므 로 서버 에서 클 라 이언 트 로 보 내야 합 니 다.이것 은 먼저 dumps()서열 화 대상 을 사용 한 다음 에 바이트 로 변환 해서 완성 한 것 이다.이제 클 라 이언 트 에 대응 하 는 내용 을 적어 봅 시다.클 라 이언 트:
import socket
import pickle
a=10
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 2133))
while True:
complete_info = b''
rec_msg = True
while True:
mymsg = s.recv(10)
if rec_msg:
print(f"The length of message = {mymsg[:a]}")
x = int (mymsg[:a ] )
rec_msg = False
complete_info += mymsg
if len(complete_info)-a == x:
print("Recieved the complete info")
print(complete_info[a:])
m = pickle.loads(complete_info[a:])
print(m)
rec_msg = True
complete_info = b''
print(complete_info)
첫 번 째 while 순환 은 전체 메 시 지 를 추적 하 는 데 도움 이 됩 니 다(completeinfo)및 버퍼 를 사용 하여 받 고 있 는 메시지(recmsg)。설정 을 통 해 rec메 시 지 를 설정 하고 메 시 지 를 받 을 때 제 가 하 는 일 은 모든 메 시 지 를 인쇄 하고 크기 가 10 인 버퍼 에서 이 메 시 지 를 받 는 것 입 니 다.이 크기 는 모든 값 일 수 있 습 니 다.구체 적 으로 는 개인 선택 에 달 려 있 습 니 다.그리고 만약 에 받 은 메시지 가 완전한 메시지 와 같다 면 저 는 메 시 지 를 받 은 완전한 정보 로 인쇄 한 다음 에 loads()를 사용 하여 메 시 지 를 역 직렬 화 할 뿐 입 니 다.위의 프로그램의 출력 은 다음 과 같 습 니 다.
이것 은 우리 로 하여 금 Socket 을 사용 하여 프로 그래 밍 을 하 는 본문의 결말 을 끝 냈 다.모든 개념 을 똑똑히 이해 해 주시 기 바 랍 니 다.
이상 은 Python 의 소켓 프로 그래 밍 에 대한 상세 한 내용 입 니 다.Python 소켓 프로 그래 밍 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.