소켓 이해
소켓은 일반적으로 "소켓"이라고도 하며, IP 주소와 포트를 설명하는 데 사용됩니다. 애플리케이션은 일반적으로 "소켓"을 통해 네트워크에 요청합니다. " 또는 네트워크 요청에 응답합니다.
소켓은 Unix에서 유래되었으며 Unix/Linux의 기본 철학 중 하나는 "모든 것이 파일이다"입니다. 파일의 경우 [열기] [읽기 및 쓰기] [닫기] 모드를 사용하여 작동합니다. 소켓은 이 모드의 구현입니다. 소켓은 특수 파일입니다. 일부 소켓 기능은 이에 대한 작업입니다(읽기/쓰기 IO, 열기, 닫기)
소켓과 파일의 차이점:
파일 모듈은 지정된 파일에 대해 [열기] [읽기 및 쓰기] [닫기]에 사용됩니다.
소켓 모듈은 서버 측 및 파일에 대해 [열기] [읽기 및 쓰기] [닫기]에 사용됩니다. 클라이언트 측 소켓.
ython(버전 3.5)은 가장 간단한 소켓 통신을 구현합니다.
#!/usr/bin/env python # coding=utf-8 # Author:Majh import socket ip_port = ('127.0.0.1', 9999) sk = socket.socket() sk.connect(ip_port) send_data = input('>>').strip() sk.send(bytes(send_data, encoding='utf-8')) recv_data = sk.recv(1024) print(str(recv_data, encoding='utf-8')) sk.close() 客户端代码
#!/usr/bin/env python # coding=utf-8 # Author:Majh import socket sk = socket.socket() ip_port = ('127.0.0.1', 9999) sk.bind(ip_port) print('sk.bind......') sk.listen(5) print('sk.listen......') conn, addr = sk.accept() print('conn:', conn) print('addr:', addr) read_data = conn.recv(1024) print('read_data', read_data) read_data = read_data.upper() conn.send(read_data) conn.close() 服务器端代码
socket 키워드 매개변수:
sk = 소켓.socket(socket.AF_INET,socket.SOCK_STREAM,0)
매개변수 1: 주소 클러스터
socket.AF_INET IPv4(기본값) )
소켓.AF_INET6 IPv6
소켓.AF_UNIX는 단일 Unix 시스템의 프로세스 간 통신에만 사용할 수 있습니다.
매개변수 2: 유형
소켓.SOCK_STREAM 스트리밍 소켓, TCP(기본값)
소켓.SOCK_DGRAM 데이터그램 소켓, UDP
소켓.SOCK_RAW 원시 소켓. 일반 소켓은 ICMP 및 IGMP와 같은 네트워크 메시지를 처리할 수 없지만 SOCK_RAW는 다음과 같습니다. 또한 원시 소켓을 사용하여 특수 IPv4 메시지를 처리할 수 있으며 IP_HDRINCL 소켓 옵션을 통해 사용자가 IP 헤더를 구성할 수 있습니다.
Socket.SOCK_RDM은 신뢰할 수 있는 UDP 형식으로 데이터그램 전달을 보장하지만 순서를 보장하지는 않습니다. SOCK_RAM은 원래 프로토콜에 대한 낮은 수준의 액세스를 제공하는 데 사용되며 ICMP 메시지 전송과 같은 특정 특수 작업을 수행해야 할 때 사용됩니다. SOCK_RAM은 일반적으로 고급 사용자나 관리자가 실행하는 프로그램으로 제한됩니다.
socket.SOCK_SEQPACKET 안정적인 연속 패킷 서비스
파라미터 3: 프로토콜
0 (기본값) 특정 주소 계열과 관련된 프로토콜이 0인 경우 시스템은 주소 형식과 소켓 카테고리를 선택하면 적절한 프로토콜이 자동으로 선택됩니다.
sk.bind(address)
s.bind(address) 소켓을 주소에 바인딩합니다. 주소 형식은 주소 계열에 따라 다릅니다. AF_INET에서는 주소가 튜플(호스트, 포트) 형식으로 표현됩니다.
sk.listen(backlog)
들어오는 연결 듣기를 시작합니다. 백로그는 연결이 거부되기 전에 보류할 수 있는 최대 연결 수를 지정합니다.
백로그는 5이며, 이는 커널이 연결 요청을 받았지만 서버가 처리를 위해 아직 수락을 호출하지 않았음을 나타냅니다.
연결 대기열이 있기 때문에 이 값은 무한할 수 없습니다.
sk.setblocking(bool)
차단 여부(기본값 True), False로 설정하면 수락 및 수신 중에 데이터가 없으면 오류가 보고됩니다.
sk.accept()
연결을 수락하고 (conn, 주소)를 반환합니다. 여기서 conn은 데이터를 주고받는 데 사용할 수 있는 새로운 소켓 객체입니다. address는 클라이언트에 연결하기 위한 주소입니다.
TCP 클라이언트로부터 연결을 받고(차단) 연결이 도착할 때까지 기다립니다.
sk.connect(address)
주소에 있는 소켓에 연결합니다. 일반적으로 주소 형식은 튜플(호스트 이름, 포트)입니다. 연결 오류가 발생하면 소켓.오류 오류가 반환됩니다.
sk.connect_ex(address)
위와 동일하지만 반환 값이 있다는 점만 제외하면 연결 성공 시 0이 반환되고 연결 실패 시 코드가 반환됩니다. 예: 10061
sk.close()
소켓을 닫습니다
sk.recv(bufsize[,flag])
소켓 데이터를 수락합니다. 데이터는 문자열로 반환되며, bufsize는 수신할 수 있는 최대 개수를 지정합니다. 플래그는 메시지에 대한 추가 정보를 제공하며 일반적으로 무시할 수 있습니다.
sk.recvfrom(bufsize[.flag])
recv()와 유사하지만 반환 값은 (데이터, 주소)입니다. 여기서 data는 수신된 데이터를 포함하는 문자열이고, address는 데이터가 전송되는 소켓 주소입니다.
sk.send(string[,flag])
문자열로 된 데이터를 연결된 소켓으로 보냅니다. 반환 값은 보낼 바이트 수이며 문자열의 바이트 크기보다 작을 수 있습니다. 즉, 지정된 모든 콘텐츠가 전송되지 않을 수 있습니다.
sk.sendall(string[,flag])
연결된 소켓으로 문자열의 데이터를 전송하지만 반환되기 전에 모든 데이터를 전송하려고 시도합니다. 성공하면 None을 반환하고, 실패하면 예외를 발생시킵니다.
내부적으로 send를 재귀적으로 호출하여 모든 콘텐츠를 보냅니다.
sk.sendto(string[,flag],address)
소켓으로 데이터를 보냅니다. address는 (ipaddr, port) 형식의 튜플이며 원격 주소를 지정합니다. 반환 값은 전송된 바이트 수입니다. 이 기능은 주로 UDP 프로토콜에 사용됩니다.
sk.settimeout(timeout)
소켓 작업의 시간 초과 기간을 설정합니다. 시간 초과는 초 단위의 부동 소수점 숫자입니다. 없음 값은 시간 초과 기간이 없음을 의미합니다. 일반적으로 타임아웃 기간은 소켓이 생성될 때 설정해야 합니다. 연결 작업에 사용될 수 있기 때문입니다(예: 클라이언트 연결 최대 5초 대기)
sk.getpeername()
연결 소켓을 반환합니다. 인터페이스의 원격 주소입니다. 반환 값은 일반적으로 튜플(ipaddr, port)입니다.
sk.getsockname()
소켓 자체 주소를 반환합니다. 일반적으로 튜플(ipaddr,port)