Python 은 socket 기반 으로 TCP/IP 클 라 이언 트 와 서버 통신 을 실현 합 니 다.

머리말
소켓 은 네트워크 주소 등 기능 을 분석 하 는 데 사용 되 는 것 외 에 도 서버 를 설정 하여 오 는 정 보 를 감청 할 수 있다.
예 를 들 어 인터넷 에서 인터넷 로봇 과 채 팅 을 하고 데 이 터 를 로봇(서버)에 보 낸 다음 에 로봇(서버)이 채 팅 데이터 정 보 를 피드백 한다.
물론 로봇 의 답장 내용 은 기계 학습 과 관련 이 있 을 수 있 지만 간단 한 소식 피드백 은 바로 소켓 의 지식 과 관련된다.
간단 한 서버 구축 과 클 라 이언 트
소켓 의 응용 을 알 았 으 니다음은 간단 한 단 방향 통신 TCP/IP 서버 와 클 라 이언 트 를 실현 합 니 다.
서버
서버 의 원 리 는 다음 과 같다.
  • 먼저 소켓 을 만 들 고 TCP 는 흐름 을 위 한 소켓 입 니 다.그래서 SOCK 를 사용 해 야 합 니 다.STREAM
  • 4.567917.그리고 bid()함 수 를 사용 하여 소켓 을 서버 주소 와 연결 합 니 다(우 리 는 로 컬 테스트 일 뿐 주 소 를 127.0.0.1 또는 localhost,포트 번 호 는 10000).물론 주변 에 컴퓨터 장치 가 2 대 있 으 면 랜 의 IP 주 소 를 직접 교체 할 수 있 습 니 다
  • listen()함 수 를 호출 하여 소켓 을 서버 모드 로 설정 한 다음 에 무한 순환 대기,매개 변 수 는 최대 대기 열 수 입 니 다
  • 4.567917.순환 중 accept()를 호출 하여 클 라 이언 트 의 메시지 연결 을 기다 리 고 있 습 니 다.클 라 이언 트 가 연결 되면 accept()함 수 는 열 린 연결 과 클 라 이언 트 주 소 를 되 돌려 줍 니 다
  • 버퍼 를 가리 키 는데 이 버퍼 는 recv 함수 가 받 은 데 이 터 를 저장 하 는 데 사 용 됩 니 다
  • sendall()을 통 해 클 라 이언 트 데 이 터 를 전송 합 니 다
  • 4.567917.데 이 터 를 전송 한 후에 현재 클 라 이언 트 와 통신 하면 완 성 된 셈 이다.close()를 사용 하여 닫 기 청소 가 필요 합 니 다.
    예제 코드 는 다음 과 같다.
    
    import socket
    
    # 1.       ,
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.  bind()              
    sock.bind(('localhost', 10000))
    # 3.  listen()              
    sock.listen(1)
    
    while True:
        # 4.  accept()          
        #           ,  accept()                  
        connection, client_address = sock.accept()
        print("       :", client_address)
        try:
            # 5.       ,        recv        
            data = connection.recv(1024)
            print(data)
            if data:
                # 6.  sendall()         。
                connection.sendall("      ".encode())
            else:
                print("         ,       ")
        finally:
            #7.    close()      
            connection.close()
    
    클 라 이언 트
    클 라 이언 트 를 실현 하 는 것 은 상대 적 으로 서버 보다 훨씬 간단 합 니 다.감청 이 필요 없 기 때문에 연결 해서 데 이 터 를 보 내 면 됩 니 다.클 라 이언 트 구현 은 주로 다음 과 같 습 니 다.
    4
  • 소켓 을 만 듭 니 다
  • connect()함 수 를 사용 하여 서버 에 연결 합 니 다
  • sendall()을 통 해 서버 에 데 이 터 를 보 냅 니 다
  • recv()를 통 해 서버 가 전달 한 데 이 터 를 받 습 니 다
  • 상호작용 이 완 료 된 후에 close()를 사용 하여 청 소 를 닫 습 니 다
  • 예 는 다음 과 같다.
    
    import socket
    
    # 1.       ,
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.  bind()              
    sock.connect(('localhost', 10000))
    
    try:
        msg = b"Are you there?"
        # 3.  sendall()        
        sock.sendall(msg)
        # 4.  recv()           
        data = sock.recv(1024)
        print(data.decode())
    finally:
        # 5.      ,  close()    
        sock.close()
    
    실행 후 서버 와 클 라 이언 트 의 상호작용 효 과 는 다음 과 같 습 니 다.
    服务器数据
    客户端数据
    create_connection(더 쉬 운 클 라 이언 트)
    연결 서버 는 connect()함 수 를 사용 하 는 것 외 에 다른 함수 create 가 있 습 니 다.connection()은 서버 를 연결 합 니 다.몇 가지 절 차 를 생략 할 수 있 습 니 다.예 는 다음 과 같다.
    
    import socket
    
    #                
    def getConstants(prefix):
        return {
            getattr(socket, n): n
            for n in dir(socket)
            if n.startswith(prefix)
        }
        
    ipproto_str = getConstants("IPPROTO_")
    family_str = getConstants("AF_")
    type_str = getConstants("SOCK_")
    
    sock = socket.create_connection(('127.0.0.1', 10000))
    print(ipproto_str[sock.proto])
    print(family_str[sock.family])
    print(type_str[sock.type])
    
    try:
        msg = b"Are you there?"
        sock.sendall(msg)
        data = sock.recv(1024)
        print(data.decode())
    finally:
        sock.close()
    
    실행 후 효 과 는 다음 과 같 습 니 다.
    客户端
    create_connection()함수 의 원 리 는 getaddrinfo()함수 로 후보 연결 의 인 자 를 찾 고 열 린 socket 을 되 돌려 주 는 것 입 니 다.getaddrinfo()함수 의 설명 내용 은 이전 socket 라 이브 러 리(클릭 하여 점프 하여 보기)에 있 습 니 다.
    파 이 썬 이 socket 을 기반 으로 TCP/IP 클 라 이언 트 와 서버 통신 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 TCP/IP 클 라 이언 트 와 서버 통신 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기