파이썬 프로젝트 - 47-소켓.md

5901 단어 python 프로젝트
##Python 프로젝트 - Day47-socket
  • 소켓은 소켓이 어떤 컴퓨터 네트워크 통신에서 가장 기초적인 내용이라고 소개한다.첫 번째는 표준 BSD Sockets API를 제공하는 Socket입니다.두 번째는 Socket Server입니다. 서버 센터 클래스를 제공하여 네트워크 서버의 개발을 간소화할 수 있습니다
  • socket 형식 가져오기 socket
     from socket import *
    
    소켓을 만듭니다
     sock= socket(family,type[,protocal]), 、 、 ( 0) 。
    

    cket 유형
    묘사
    cket.AF_UNIX
    단일 Unix 시스템 프로세스 간 통신에만 사용 가능
    cket.AF_INET
    서버 간 네트워크 통신
    cket.AF_INET6
    IPv6
    cket.SOCK_STREAM
    유동식 socket, for TCP
    cket.SOCK_DGRAM
    데이터 보고 socket, for UDP
    cket.SOCK_RAW
    원본 소켓, 일반 소켓은 ICMP, IGMP 등의 네트워크 메시지를 처리할 수 없지만 SOCK_RAW 가능;다음, SOCK_RAW도 특수한 IPv4 메시지를 처리할 수 있다.또한 원본 소켓을 사용하여 IP_HDRINCL 소켓 옵션은 사용자가 IP 헤더를 구성합니다.
    cket.SOCK_SEQPACKET
    안정적인 무중단 데이터 패킷 서비스
    TCP Socket:
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    UDP Socket:
    s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  • socket 함수
  • TCP가 데이터를 전송할 때 TCP 연결이 설정되어 있으므로 주소를 지정할 필요가 없습니다.UDP는 연결이 없는 것을 대상으로 합니다. 보낼 때마다 누구에게 보낼 것인지 지정해야 합니다..
  • 서버와 클라이언트는 목록, 모듈, 사전을 직접 보낼 수 없습니다.문자열화repr(data)가 필요합니다

  • cket 함수
    묘사
    rver 함수
    bind(address)
    소켓을 주소에 바인딩합니다. AF_INET 아래, 메타그룹 (host,port) 의 형식으로 주소를 표시합니다.
    listen(backlog)
    TCP 전송 연결을 수신하기 시작합니다.backlog는 연결을 거부하기 전에 운영체제가 끊을 수 있는 최대 연결 수량을 지정합니다.이 값은 적어도 1이고 대부분의 응용 프로그램은 5로 설정하면 된다.
    accept()
    TCP 연결을 받아들이고 (conn,address) 되돌아옵니다. 그 중에서 conn은 새로운 플러그인 대상입니다. 데이터를 수신하고 발송할 수 있습니다.address는 클라이언트를 연결하는 주소입니다.
    ient 함수
    connect(address)
    address에 연결된 플러그인.일반address의 형식은 모듈 (hostname,port) 이며, 연결이 잘못되면 socket으로 돌아갑니다.error 오류입니다.
    connect_ex(adddress)
    기능은connect(address)와 같지만 0을 되돌려줍니다. errno의 값을 되돌려줍니다.
    socket 함수
    recv(bufsize[,flag])
    TCP 소켓의 데이터를 사용합니다.데이터는 문자열 형식으로 되돌아오고bufsize는 수신할 최대 데이터 양을 지정합니다.flag는 메시지에 대한 다른 정보를 제공합니다. 보통 무시할 수 있습니다.
    send(string[,flag])
    TCP 데이터를 전송합니다.string의 데이터를 연결된 플러그인에 보냅니다.반환 값은 보내는 바이트 수량입니다. 이 수량은string의 바이트 크기보다 작을 수 있습니다.
    sendall(string[,flag])
    전체 TCP 데이터 전송string의 데이터를 연결된 플러그인에 보내지만, 되돌아오기 전에 모든 데이터를 보내려고 시도합니다.None으로 되돌아오는 데 성공하고, 실패하면 이상을 던집니다.
    recvfrom(bufsize[.flag])
    UDP 소켓의 데이터를 적용합니다.recv () 와 유사하지만 반환 값은 (data,address) 입니다.그 중에서 데이터는 수신 데이터를 포함하는 문자열이고address는 데이터를 보내는 플러그인 주소입니다.
    sendto(string[,flag],address)
    UDP 데이터를 전송합니다.데이터를 플러그인에 보내면address는 (ipaddr,port) 형식의 모듈로 원격 주소를 지정합니다.반환 값은 보내는 바이트 수입니다.
    close()
    소켓을 닫다.
    getpeername()
    연결 소켓의 원격 주소를 되돌려줍니다.반환 값은 보통 그룹 (ipaddr,port) 입니다.
    getsockname()
    소켓 자신의 주소를 되돌려줍니다.보통 하나의 모듈 (ipaddr,port)
    setsockopt(level,optname,value)
    소켓 옵션에 대한 값을 설정합니다.
    getsockopt(level,optname[.buflen])
    소켓 옵션의 값을 되돌려줍니다.
    settimeout(timeout)
    플러그인 조작의 시간을 초과하는 것을 설정합니다.timeout은 부동점수이고 단위는 초입니다.None 값은 시기를 초과하지 않았음을 나타냅니다.일반적으로, 연결 작업에 사용할 수 있기 때문에, 시간 초과는 플러그인을 만들 때 설정해야 합니다. (예:connect ()
    gettimeout()
    현재 시간 초과 값을 되돌려줍니다. 단위는 초입니다. 시간 초과를 설정하지 않으면 None으로 돌아갑니다.
    fileno()
    소켓의 파일 설명자를 되돌려줍니다.
    setblocking(flag)
    flag가 0이면 플러그인을 비차단 모드로 설정하고, 그렇지 않으면 플러그인을 차단 모드 (기본값) 로 설정합니다.비차단 모드에서recv () 를 호출하면 데이터가 발견되지 않거나send () 호출로 데이터를 즉시 보낼 수 없으면socket을 일으킬 수 있습니다.error 예외입니다.
    makefile()
    이 소켓과 연결된 파일 만들기
  • 소켓 프로그래밍 사고방식 소켓 도입
     from socket import *
    
    TCP 서버:
  • 소켓을 만들고 소켓을 로컬 IP와 포트에 연결합니다
     sock=socket(AF_INET,SOCK_STREAM)
     ip_port=("127.0.0.1",8080)
     sock.bind(ip_port)
    
  • 감청 연결을 시작합니다
     sock.listen(5)
    
  • 순환에 들어가 클라이언트의 요청을 끊임없이 받는다
     sock.accept()
    
  • 그리고 전송된 데이터를 수신하여 상대방에게 되돌려줍니다
     #1024 
     sock.recv(1024)
     # , ip:port, : 
     sock.recvfrom(1024)
     #sendto , , (ip,port), ("127.0.0.1",8080)
     sock.sendto(" ".encode(),("127.0.0.1",8080))
    

  • TCP 클라이언트:
  • 소켓을 만들고 원격 주소를 연결합니다
     sock=socket(AF_INET,SOCK_STREAM)
     sock.connect(('127.0.0.1',8097))
    
  • 연결 후 데이터 전송과 수신
     sock.recvfrom(1024)
     sock.sendto(" ".encode(),("127.0.0.1",8080))
    
  • 전송이 끝난 후 플러그인을 닫습니다
     sock.close()
    

  • socket 흐름도
  • socket-Demo socket-client.py
     from socket import *
     
     udpSocket=socket(AF_INET,SOCK_DGRAM)
     
     udpSocket.connect(('127.0.0.1',8097))
     while True:
         input_text=input(" ----")
         udpSocket.send(input_text.encode())
    
    socket-server.py
     from socket import *
     
     udpSocket=socket(AF_INET,SOCK_DGRAM)
     ip_port=("127.0.0.1",8097)
     udpSocket.bind(ip_port)
     while True:
         recvInfo= udpSocket.recvfrom(1024)
         print("{}:{}".format(str(recvInfo[1]),recvInfo[0].decode()))
         udpSocket.sendto(recvInfo[0],recvInfo[1])
    
  • QQ-다중 스레드 모방
     from threading import Thread
     from socket import *
     
     udpSocket=None
     desIp=""
     desPort=0
     port=0
     #  , 
     def recvData():
         while True:
             recvInfo = udpSocket.recvfrom(1024)
             #  ip:port, 
             print("{}<<: recvinfo="" def="" senddata="" while="" true:="" sendinfo="input("">>")
             udpSocket.sendto(sendInfo.encode(),(desIp,desPort))
     
     def main():
         global udpSocket
         global desIp
         global desPort
         udpSocket = socket(AF_INET, SOCK_DGRAM)
     
         port=int(input(" "))
         desIp=input(" ip")
         desPort=int(input(" "))
         ip_port = ("127.0.0.1", port)
         udpSocket.bind(ip_port)
     
         tr=Thread(target=recvData)
         ts=Thread(target=sendData)
         tr.start()
         ts.start()
     
         #  
         tr.join()
         ts.join()
     
     if __name__ == '__main__':
         main()
    
  • 좋은 웹페이지 즐겨찾기