1》Socket相關: 1>Socket Families(地址簇): socket.AF_UNIX 本機進程間通信 socket.AF_INET IPV4 socket.AF_INET6 IPV6 2>Socket Types: socket.SOCK_STREAM #for tcp socket ...
1》Socket相關:
1>Socket Families(地址簇):
socket.AF_UNIX 本機進程間通信
socket.AF_INET IPV4
socket.AF_INET6 IPV6
2>Socket Types:
socket.SOCK_STREAM #for tcp
socket.SOCK_DGRAM #for udp
socket.SOCK_RAW #原始套接字,普通的套接字無法處理ICMP,IGMP等網路報文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的 IPv4報文,此外利用原始套接字,可以通過IP_HDRINCL套接字選項由用戶構造IP頭;
socket.SOCK_RDM #是一種可靠的UDP形式,即保證交付數據報但不保證順序;SOCK_RAM用來提供對原始協議的低級訪問,在需要執行某些特殊 操作時使用,如發送ICMP報文,SOCK_RAM通常僅限於高級用戶或管理員運行的程式使用;
socket.SOCK_SEQPACKET #廢棄了
3>Socket方法:
socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)
socket.socketpair([family[,type[,proto]]])
socket.create_connection(address[,timeout[,source_address]])
socket.getaddrinfo(host,port,family=0,type=0,proto=0,flags=0) # 獲取要連接的對端主機地址;
sk.bind(address)
s.bind(address):將套接字綁定到地址,address地址的格式取決於地址簇,在AF_INET下,以(host,port)的形式表示地址;
sk.listen(backlog):開始監聽傳入連接,backlog指定在拒絕連接之前,可以掛起的最大連接數量;backlog等於5,表示內核已經接到了連接請求,但伺服器還 沒有調用accept進行處理的連接個數,這個值不能無限大,因為要在內核中維護連接隊列;
sk.setblocking(bool):是否阻塞(預設True),如果設置False,那麼accept和recv時一旦無數據,則報錯;
sk.accept():接受連接並返回(conn,address),其中conn是新的套接字對象,可以用來接收和發送數據,address用來接收客戶端的地址;接收TCP客戶的連 接(阻塞式)等待連接的到來;
sk.connect(address):連接到address處的套接字,一般address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤;
sk.connect_ex(address):同上,只不過會有返回值,連接成功時返回0,連接失敗時返回編碼,列如10061;
sk.close():關閉套接字;
sk.recv(bufsize[,flag]):接受套接字的數據,數據以字元串形式返回,bufsize指定最多可接收的數量,flag提供有關信息,通常可以忽略;
sk.recvfrom(bufsize[,flag]):與recv()類似,但返回值是(data,address),其中data是包含接收數據的字元串,address是套接字地址;
sk.send(string[,flag]):將string中的數據發送到連接的套接字,返回值是要發送的位元組數量,該數量可能小於string的位元組數量,即可能未將指定內容全部發 送;
sk.sendall(string[,flag]):將string中的數據發送到連接的套接字,但在返回之前會嘗試發送所有數據,成功則返回None,否則失敗;內部通過遞歸調用send,將所 有內容發送出去;
sk.sendto(string[,flag],address):將數據發送到套接字,address是形式為(ipaddr,port)的元組,指定運程地址,該函數主要用於UDP協議;
sk.settimeout(timeout):設置套接字操作的超時期,timeout是一個浮點數,單位是秒,值為None表示沒有超時期,一般應該在剛創建套接字時設置,因為他們 可能用於連接的操作(如client連接最多等待5s);
sk.getpeername():返回連接套接字的遠程地址,返回值通常是元組(ipaddr,port);
sk.getsockname():返回套接字自己的地址,通常是一個元組(ipaddr,port);
sk.fileno():套接字的文件描述符;
socket.sendfile(file,offset=0,count=None);發送文件,但目前多數情況下並無什麼用;
2》Socket Server:
1>常用的socket server:
class socketserver.ForkingTCPServer
class socketserver.ForkingUDPServer
class socketserver.ThreadingTCPServer
class socketserver.ThreadingUDPServer
2>
2》Socketserver實例:
伺服器端:
客戶端:
實例效果:
客戶端: