Python 의 소켓 프로 그래 밍 은 무엇 입 니까?

9350 단어 Python소켓
Why use Sockets?
소켓 은 네트워크 의 기초 이다.그것들 은 두 개의 서로 다른 프로그램 이나 장치 사이 의 정보 전송 을 가능 하 게 한다.예 를 들 어 브 라 우 저 를 열 때 클 라 이언 트 로 서 서버 와 연결 하여 정보 전송 을 하고 있 습 니 다.
이런 통신 을 깊이 연구 하기 전에 우 리 는 먼저 이 콘센트 들 의 정확 한 의 미 를 알 아 보 자.
What are Sockets?
일반적으로 소켓 은 데 이 터 를 보 내 고 받 기 위 한 내부 점 이다.하나의 네트워크 는 통신 장치 나 프로그램 마다 두 개의 소켓 을 가지 게 될 것 이다.이 소켓 들 은 IP 주소 와 포트 의 조합 이다.사용 하 는 포트 번호 에 따라 하나의 장 치 는 n 개의 슬롯 을 가 질 수 있다.서로 다른 포트 는 서로 다른 유형의 프로 토 콜 에 사용 할 수 있 습 니 다.일반적인 포트 번호 와 관련 프로 토 콜 에 대한 더 많은 정 보 를 얻 기 위해 아래 그림 을 보십시오.
公共端口-Python中的SocketProgramming-Edureka
이제 소켓 의 개념 을 알 게 되 었 습 니 다.Python 의 Socket 모듈 을 살 펴 보 겠 습 니 다.
어떻게 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 개의 바이트(버퍼 크기)를 받 을 수 있다 는 것 을 기억 하 십시오.임 의 수량 을 지정 할 수 있 으 며,구체 적 으로 전송 하 는 정 보 량 에 달 려 있다.
마지막 으로 전송 중인 메 시 지 는 디 코딩 과 인쇄 를 해 야 합 니 다.
클 라 이언 트-서버 프로그램 을 만 드 는 방법 을 알 고 있 으 니 어떻게 실행 하 는 지 계속 보 겠 습 니 다.
Echo Client-Server:
이 프로그램 을 실행 하려 면 명령 프롬프트 를 열 고 클 라 이언 트 와 서버 프로그램 을 만 든 폴 더 에 들 어가 서 입력 하 십시오.
py server.py(여기 서 server.py 는 서버 의 파일 이름 입 니 다.py-3.7 server.py 를 사용 할 수 있 습 니 다)
이 작업 이 완료 되면 서버 가 실 행 됩 니 다.클 라 이언 트 를 실행 하려 면 다른 cmd 창 을 열 고 입력 하 십시오:
py client.py(여기,client.py 는 클 라 이언 트 의 파일 이름)
출력(서버): 
Python-Edureka中的cmd服务器套接字编程
(고객)
cmd client-SocketProgramminginPython-Edureka
버퍼 크기 를 7 로 줄 여 같은 프로그램 을 시도 한 다음 에 우리 가 어떤 출력 을 얻 었 는 지 봅 시다.
출력: 
Python-Edureka中的client2-Socket编程
보시 다시 피 연결 은 7 개의 바이트 전송 후 종 료 됩 니 다.그러나 이것 은 문제 입 니 다.완전한 정 보 를 받 지 못 했 고 연결 이 닫 혔 기 때 문 입 니 다.이 문 제 를 계속 해결 합 시다.
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()
출력 은 다음 그림 과 같 습 니 다:
출력:
Python-Edureka中的client2-Socket编程
위의 코드 블록 이 하 는 모든 작업 은 정보의 크기 를 검사 하고 한 번 에 두 바이트 의 버퍼 에 인쇄 한 다음 연결 이 끝 난 후에 닫 는 것 입 니 다.
파 이 썬 대상 전송:
여기까지 만 문자열 을 전송 하 는 노하우 가 생 겼 습 니 다.그러나 Python 의 소켓 프로 그래 밍 도 Python 대상 을 전송 할 수 있 습 니 다.이 대상 들 은 집합,원조,사전 등 모든 대상 이 될 수 있다.이 목적 을 실현 하려 면 Python 의 pickle 모듈 을 가 져 와 야 합 니 다.
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 대상 을 전송 할 수 있 습 니 다.
어떻게 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()를 사용 하여 메 시 지 를 역 직렬 화 할 뿐 입 니 다.위의 프로그램의 출력 은 다음 과 같 습 니 다.
在Python-Edureka中发送对象套接字编程
이 파 이 썬 의 소켓 프로 그래 밍 은 무엇 입 니까?의 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 Python 소켓 프로 그래 밍 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기