python10-socket

6332 단어

socket 네트워크 프로그래밍

  • socket은 tcp, IP 프로토콜을 기반으로 하는 도구입니다
  • 모든 네트워크 통신은 socket 기반
  • wanghzh/p/5560787.html
  • wupeiqi/articles/5040823.html

  • 클라이언트가 서버에 액세스하려면:
  • TCP: 세 번의 악수
  • UDP: 단방향 액세스
  • python은 유닉스 시스템 프로세스와 프로세스 간의 통신을 지원합니다


  • 스스로 socket 클라이언트와 서버를 실현하다


    socket 서버
    import socket
    
    sk = socket.socket()  #  , socket
    ip_port = ('127.0.0.1', 9999)
    sk.bind(ip_port)  # socket ip 
    sk.listen(5)  # socket 
    
    while True:
        sock, addr = sk.accept()  #  
        sock.sendall(bytes(' ', encoding='utf-8'))
        print(type(sock))
        while True:
            try:
                byte_data = sock.recv(1024) #  , 
                data = str(byte_data, encoding='utf-8')
                ret = ' :%s' % data
                sock.sendall(bytes(ret, encoding='utf-8'))
                if data == 'q':
                    break
            except Exception as e:
                break
            else:
                pass
            finally:
                pass
    

    socket 클라이언트
    import socket
    
    client = socket.socket()  #  socket
    client.connect(('127.0.0.1', 9999,))  # socket 
    byte_data = client.recv(1024)
    print(str(byte_data, encoding='utf-8'))
    while True:
        inp = input()
        client.sendall(bytes(inp, encoding='utf-8'))
        byte_data = client.recv(1024)
        data = str(byte_data, encoding='utf-8')
        if data == ' :q':
            print(' ')
            break
        else:
            print(data)
    client.close()
    
  • socket.sendall () 방법은python2.7에서 문자열을 수신하고python3.x에서 ude를 받는 것은 바이트입니다

  • socket 더 많은 방법

  • wupeiqi/articles/5040823.html
  • sk = socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM,proto=0)
    # family:socket.AF_INET = IPv4( ) IPv6
    # type:TCP 
    # proto: 0
    
    sk.bind((ip,port,)
    #  IP port
    
    sk.listen(count)
    #  , , count == 2
    #  , 2 , 2 , , count == 2 
    
    sk.setblocking(bool)
    #  
    # True: ( )
    # False: , socket recv accept , 
    
    sk.connect((ip,port,)
    #  
    sk.connect_ex((ip,port,)
    #  , , 0, , 
    
    sk.close()
    #  
    
    sk.recv(1024)
    #  , 
    sk.recvfrom(buffersize)
    #  UPD 
    
    sk.send()
    #  ,2.7 ,3.x 
    # send , 
    sk.sendall()
    #  send , 
    sk.sendto()
    #  UDP
    
    sk.settimeout()
    #  
    
    sk.getsocketname()
    #  socket 
    sk.getpeername()
    #  socket 
    
    sk.fileno()
    # socket ( )
    

    socket 파일 업로드

  • 접착 문제를 방지하는 데 주의하세요

  • server
    import socket
    
    server = socket.socket()
    server.bind(('127.0.0.1', 9999))
    server.listen(5)
    print(' :
    >>>>>') while True: conn,address = server.accept() print(' :ip:%s port:%s'%(address[0], address[1])) retStr = ' , ' conn.sendall(bytes(retStr, encoding='utf-8')) fileInfo = conn.recv(1024) fileInfo = str(fileInfo, encoding='utf-8') fileName, fileLength = fileInfo.split('&') print(' :%s :%s'%(fileName,fileLength)) conn.sendall(bytes(' ',encoding='utf-8')) totalLength = int(fileLength) hasLoadSize = 0 file = open(fileName, mode='wb') while True: if hasLoadSize >= totalLength: break data = conn.recv(1024) file.write(data)

    client
    import socket
    import os
    client = socket.socket()
    client.connect(('127.0.0.1', 9999))
    
    connectInfo = client.recv(1024)
    connectInfo = str(connectInfo, encoding='utf-8')
    print(connectInfo)
    fileName = input(' 
    >>> ') fileLength = os.stat('dest_top_img.jpg').st_size ret_msg = '%s&%s'%(fileName,fileLength) client.sendall(bytes(ret_msg, encoding='utf-8')) rec_msg = client.recv(1024) print(str(rec_msg, encoding='utf-8')) print(str(rec_msg, encoding='utf-8')) with open('dest_top_img.jpg', mode='rb') as file: for line in file: client.sendall(line) client.close()
  • 접착 원인:
  • 오류 보고: ImageNotLoaded(다운로드 후 파일을 열 수 없음)
  • 클라이언트가 서버에 파일을 보내려면 시스템의 버퍼에 의존해야 한다
  • 서버는 클라이언트가 보낸 파일을 수신하고 버퍼에 가져가야 합니다
  • 그러나 클라이언트 버퍼가 언제 발송되는지는 시스템이 결정하고 제어할 수 없다. 이런 상황이 존재할 수 있다. 파일 이름과 파일 크기를 서버에 보낼 때 데이터가 버퍼에 저장되어 직접 전송된 파일 내용을 보내지 못한다. 서버가 문서와 파일 크기의 필드에 일부 파일의 내용을 가져오면 전송해야 할 파일이 서버에 실제 수신될 때 완전하지 않다
  • 해결: 전송 파일 이름, 크기와 전송 파일 사이에 서버와 응답합니다


  • socketserver 모듈 다중 병발 실현

  • socket 모듈은 다중 병발을 지원하지 않으며 서비스 측은 같은 시간에 클라이언트 요청에 응답하는 것만 지원합니다
  • 병렬 처리에는 두 가지 방법이 있다.
  • IO 다중 복용
  • socketserver 모듈:python에서 제공하는 또 다른 모듈로 다중 접근 문제를 해결하는 데 사용
  • 내부 실현: IO 다중 복용 & 다중 스레드 또는 다중 프로세스 병행 조작

  • 구현 단계:
  • 창설 클래스 계승: socketserver.BaseRequestHandler
  • 서버를 만들고 IP 포트와 새로 만든 클래스에 전송합니다
  • 서비스 오픈


  • ```
    import socketserver
    
    class MyServer(socketserver.BaseRequestHandler):
        def handle(self):
            print(self.request) #  
            print(self.client_address) #  
            print(self.server) #  :server
    
    if __name__ == '__main__':
        server = socketserver.ThreadingTCPServer(('127.0.0.1',9999),MyServer)
        server.serve_forever()
    # 
    # ('127.0.0.1', 4971)
    # 
    ```
    
    ```
    import socket
    client = socket.socket()
    client.connect(('127.0.0.1',9999))
    ```
    

    빗질

  • 대상 중 봉인 대상
  • 대상을 향한 두 가지 특성
  • 장식기 + 방법
  • @property + 방법

  • python2.7 계승 절차
  • 상속object 클래스(신식 클래스): 맨 마지막
  • 미계승object류(경전류): 한 길이 어두워지면 깊이가 우선입니다

  • python3.x 상속 프로세스
  • 맨 마지막

  • 추상류와 추상적 방법(python에서 현재 많이 사용되지 않음)
  • 구속
  • 인터페이스(python에 인터페이스가 없음)
  • 추상류+추상방법

  • 좋은 웹페이지 즐겨찾기