1. 程式人生 > >Socket常用語法與socketserver實例

Socket常用語法與socketserver實例

lis 等待 server 編碼 udp協議 單位 ufs 設置 offset

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實例:

       服務器端:

           技術分享 

      客戶端:

          技術分享

      實例效果:

          客戶端:

              技術分享

       

            

          

                  

Socket常用語法與socketserver實例