IT培訓(xùn)網(wǎng)
IT在線學(xué)習(xí)
Socket是網(wǎng)絡(luò)編程中常用的一個(gè)術(shù)語。通常一個(gè)Socket表示用計(jì)算機(jī)軟件建立的一個(gè)網(wǎng)絡(luò)鏈接。一個(gè)Socket的建立過程需要給出目的計(jì)算機(jī)的IP地址和端口號,再指定協(xié)議類型即可。
下面給出一個(gè)Socket的示例:
- >>> sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
其中,第一個(gè)參數(shù)代表地址簇,包括如下可選項(xiàng):
①socket.AF_INET,代表IPv4協(xié)議,是默認(rèn)值。
②socket.AF_INET6,代表IPv6協(xié)議。
③socket.AF_UNIX,僅在UNIX操作系統(tǒng)進(jìn)程間通信中使用。
第二個(gè)參數(shù)代表類型,包括如下可選項(xiàng):
①socket.SOCK_STREAM,代表TCP協(xié)議采用的流式Socket,是默認(rèn)值。
②socket.SOCK_DGRAM,代表UDP協(xié)議采用的數(shù)據(jù)報(bào)式Socket。
③socket.SOCK_RAW,代表原始套接字,采用普通的套接字不能處理ICMP、IGMP等網(wǎng)絡(luò)報(bào)文,而采用SOCK_RAW則可以處理。SOCK_RAW也可以處理特殊的IPv4報(bào)文。此外,利用SOCK_RAW可以通過IP_HDRINCL套接字選項(xiàng)使用戶能自己構(gòu)造IP頭。
④socket.SOCK_RDM,代表一種相對可靠的UDP形式,即保證交付數(shù)據(jù)報(bào),但不保證UDP數(shù)據(jù)報(bào)的順序。在執(zhí)行某些特殊操作時(shí)需要使用SOCK_RDM,如發(fā)送ICMP報(bào)文。
⑤socket.SOCK_SEQPACKET,代表提供一種可靠的連續(xù)數(shù)據(jù)報(bào)服務(wù)。
第三個(gè)參數(shù)代表協(xié)議,0為默認(rèn)值,根據(jù)地址格式和套接字類別,系統(tǒng)會自動選擇一個(gè)合適的協(xié)議。
Socket具有很多方法,下面分類介紹。
(1)服務(wù)器端套接字方法
sk.bind(address):將套接字綁定到地址address。在AF_INET協(xié)議下,以元組(hostname, port)的形式表示地址。
sk.listen(backlog):開始監(jiān)聽,傳入連接的最大數(shù)目。backlog指定在系統(tǒng)拒絕連接之前,可以掛起的最大連接數(shù)量。例如,backlog=5,表示系統(tǒng)已經(jīng)接到了連接請求,但服務(wù)器端還沒有調(diào)用accept()方法進(jìn)行處理的連接個(gè)數(shù)最大為5。這個(gè)值不能無限大,因?yàn)橐谙到y(tǒng)中維護(hù)連接隊(duì)列,從而需要資源。
sk.setblocking(bool):是否阻塞(默認(rèn)值為True),如果設(shè)置為False,那么accept()和recv()在接收到空包無數(shù)據(jù)時(shí)報(bào)錯(cuò)。
sk.accept():接受TCP 客戶端的連接(阻塞式),等待連接的到來,并返回(conn, address)。其中conn是新建的套接字對象,可以用來接收和發(fā)送數(shù)據(jù);address是連接客戶端的地址。
(2)客戶端套接字方法
sk.connect(address):連接到address地址的套接字。address的一般格式為元組(hostname, port)。如果連接失敗,返回socket.error錯(cuò)誤。
sk.connect_ex(address):連接到address地址的套接字。address的一般格式為元組(hostname, port)。如果連接成功,返回 0 ;如果連接失敗,返回編碼。
(3)通用套接字方法
sk.close():關(guān)閉套接字。
sk.recv(bufsize):接收套接字的數(shù)據(jù),數(shù)據(jù)以字符串形式返回。bufsize是緩沖區(qū)大小,指定一次最多可以接收的數(shù)據(jù)數(shù)量。
sk.recvfrom(bufsize):與recv()類似,但返回值是一個(gè)元組(data, address)。其中data是包含接收數(shù)據(jù)的字符串;address是發(fā)送數(shù)據(jù)的套接字地址。
sk.send(string):將string中的數(shù)據(jù)發(fā)送到連接的套接字。
sk.sendall(string):發(fā)送完整的TCP數(shù)據(jù)(本質(zhì)就是循環(huán)調(diào)用send()。sendall()在待發(fā)送數(shù)據(jù)量大于己端緩存區(qū)剩余空間時(shí),數(shù)據(jù)不會丟失,循環(huán)調(diào)用send()直到發(fā)完為止)。
sk.sendto(string, address):將數(shù)據(jù)發(fā)送到套接字。address的一般格式為元組(hostname, port),指定遠(yuǎn)程地址。
sk.settimeout(timeout):設(shè)置套接字操作的超時(shí)期。timeout是一個(gè)浮點(diǎn)數(shù),單位為秒,值為None表示沒有超時(shí)期。超時(shí)期一般應(yīng)該在剛創(chuàng)建套接字時(shí)對于連接的操作設(shè)置(如 client 連接最多等待5s )。
更多內(nèi)容
>>本文地址:http://www.yiyunku.cn/zhuanye/2021/69827.html
聲明:本站稿件版權(quán)均屬中公教育優(yōu)就業(yè)所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
1 您的年齡
2 您的學(xué)歷
3 您更想做哪個(gè)方向的工作?