Python全棧之路系列之socket

socket是網(wǎng)絡(luò)連接端點。例如當(dāng)你的Web瀏覽器請求baidu.com的網(wǎng)站時,你的Web瀏覽器創(chuàng)建一個socket并命令它去連接baidu.com的Web服務(wù)器主機(jī)恢恼,Web服務(wù)器也對過來的請求在一個socket上進(jìn)行監(jiān)聽斯入。兩端使用各自的socket來發(fā)送和接收信息。

在使用的時候五辽,每個socket都被綁定到一個特定的IP地址和端口。IP地址是一個由4個數(shù)組成的序列外恕,這4個數(shù)均是范圍0255中的值杆逗;端口數(shù)值的取值范圍是065535。端口數(shù)小于1024的都是為眾所周知的網(wǎng)絡(luò)服務(wù)所保留的鳞疲;最大的保留數(shù)被存儲在socket模塊的IPPORT_RESERVED變量中罪郊。

不是所有的IP地址都對世界的其它地方可見。實際上尚洽,一些是專門為那些非公共的地址所保留的(比如形如192.168.y.z或10.x.y.z)悔橄。地址127.0.0.1是本機(jī)地址;它始終指向當(dāng)前的計算機(jī)腺毫。程序可以使用這個地址來連接運行在同一計算機(jī)上的其它程序癣疟。

IP地址不好記,你可以花點錢為特定的IP地址注冊一個主機(jī)名或域名拴曲。域名服務(wù)器(DNS)處理名字到IP地址的映射争舞。每個計算機(jī)都可以有一個主機(jī)名,即使它沒有在官方注冊澈灼。

Python 提供了兩個基本的 socket 模塊竞川。

  • 第一個是Socket,它提供了標(biāo)準(zhǔn)的 BSD Sockets API
  • 第二個是 SocketServer叁熔, 它提供了服務(wù)器中心類委乌,可以簡化網(wǎng)絡(luò)服務(wù)器的開發(fā)。

Socket對象


sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)

參數(shù)一:地址簇

參數(shù)            描述
socket.AF_INET    IPv4(默認(rèn))
socket.AF_INET6 IPv6
ocket.AF_UNIX   只能夠用于單一的Unix系統(tǒng)進(jìn)程間通信

參數(shù)二:類型

參數(shù)          描述
socket.SOCK_STREAM  流式socket , for TCP (默認(rèn))
socket.SOCK_DGRAM   數(shù)據(jù)報式socket , for UDP
socket.SOCK_RAW 原始套接字荣回,普通的套接字無法處理ICMP遭贸、IGMP等網(wǎng)絡(luò)報文,而SOCK_RAW可以心软;其次壕吹,SOCK_RAW也可以處理特殊的IPv4報文;此外删铃,利用原始套接字耳贬,可以通過IP_HDRINCL套接字選項由用戶構(gòu)造IP頭。
socket.SOCK_RDM 是一種可靠的UDP形式猎唁,即保證交付數(shù)據(jù)報但不保證順序咒劲。SOCK_RAM用來提供對原始協(xié)議的低級訪問,在需要執(zhí)行某些特殊操作時使用,如發(fā)送ICMP報文腐魂。SOCK_RAM通常僅限于高級用戶或管理員運行的程序使用帐偎。
socket.SOCK_SEQPACKET   可靠的連續(xù)數(shù)據(jù)包服務(wù)

參數(shù)三:協(xié)議

參數(shù)      描述
0   (默認(rèn))與特定的地址家族相關(guān)的協(xié)議,如果是 0 ,則系統(tǒng)就會根據(jù)地址格式和套接類別,自動選擇一個合適的協(xié)議

Socket類方法


方法        描述
s.bind(address) 將套接字綁定到地址蛔屹。address地址的格式取決于地址族削樊。在AF_INET下,以元組(host,port)的形式表示地址判导。
sk.listen(backlog)  開始監(jiān)聽傳入連接嫉父。backlog指定在拒絕連接之前,可以掛起的最大連接數(shù)量眼刃。
sk.setblocking(bool)    是否阻塞(默認(rèn)True),如果設(shè)置False摇肌,那么accept和recv時一旦無數(shù)據(jù)擂红,則報錯。
sk.accept() 接受連接并返回(conn,address),其中conn是新的套接字對象围小,可以用來接收和發(fā)送數(shù)據(jù)昵骤。address是連接客戶端的地址。
sk.connect(address) 連接到address處的套接字肯适。一般变秦,address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤框舔。
sk.connect_ex(address)  同上蹦玫,只不過會有返回值,連接成功時返回 0 刘绣,連接失敗時候返回編碼樱溉,例如:10061
sk.close()  關(guān)閉套接字連接
sk.recv(bufsize[,flag]) 接受套接字的數(shù)據(jù)。數(shù)據(jù)以字符串形式返回纬凤,bufsize指定最多可以接收的數(shù)量福贞。flag提供有關(guān)消息的其他信息,通惩J浚可以忽略挖帘。
sk.recvfrom(bufsize[.flag]) 與recv()類似,但返回值是(data,address)恋技。其中data是包含接收數(shù)據(jù)的字符串拇舀,address是發(fā)送數(shù)據(jù)的套接字地址。
sk.send(string[,flag])  將string中的數(shù)據(jù)發(fā)送到連接的套接字猖任。返回值是要發(fā)送的字節(jié)數(shù)量你稚,該數(shù)量可能小于string的字節(jié)大小。即:可能未將指定內(nèi)容全部發(fā)送。
sk.sendall(string[,flag])   將string中的數(shù)據(jù)發(fā)送到連接的套接字刁赖,但在返回之前會嘗試發(fā)送所有數(shù)據(jù)搁痛。成功返回None,失敗則拋出異常宇弛。內(nèi)部通過遞歸調(diào)用send鸡典,將所有內(nèi)容發(fā)送出去。
sk.sendto(string[,flag],address)    將數(shù)據(jù)發(fā)送到套接字枪芒,address是形式為(ipaddr彻况,port)的元組,指定遠(yuǎn)程地址舅踪。返回值是發(fā)送的字節(jié)數(shù)纽甘。該函數(shù)主要用于UDP協(xié)議。
sk.settimeout(timeout)  設(shè)置套接字操作的超時期抽碌,timeout是一個浮點數(shù)悍赢,單位是秒。值為None表示沒有超時期货徙。
sk.getpeername()    返回連接套接字的遠(yuǎn)程地址左权。返回值通常是元組(ipaddr,port)。
sk.getsockname()    返回套接字自己的地址痴颊。通常是一個元組(ipaddr,port)
sk.fileno() 套接字的文件描述符

socket編程思路


TCP服務(wù)端

  1. 創(chuàng)建套接字赏迟,綁定套接字到本地IP與端口
  2. 開始監(jiān)聽連接
  3. 進(jìn)入循環(huán),不斷接受客戶端的連接請求
  4. 然后接受傳來的數(shù)據(jù)蠢棱,并發(fā)送給對方數(shù)據(jù)
  5. 傳輸完畢后锌杀,關(guān)閉套接字

TCP客戶端

  1. 創(chuàng)建套接字,連接遠(yuǎn)端地址
  2. 連接后發(fā)送數(shù)據(jù)和接收數(shù)據(jù)
  3. 傳輸完畢后裳扯,關(guān)閉套接字

創(chuàng)建一個socket連接


s1.py為服務(wù)端

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

import socket

# 創(chuàng)建一個socket對象
sk = socket.socket()

# 綁定允許連接的IP地址和端口
sk.bind(('127.0.0.1', 6254, ))

# 服務(wù)端允許起來之后抛丽,限制客戶端連接的數(shù)量,如果超過五個連接饰豺,第六個連接來的時候直接斷開第六個亿鲜。
sk.listen(5)

print("正在等待客戶端連接....")
# 會一直阻塞,等待接收客戶端的請求冤吨,如果有客戶端連接會獲取兩個值蒿柳,conn=創(chuàng)建的連接,address=客戶端的IP和端口
conn, address = sk.accept()
# 輸入客戶端的連接和客戶端的地址信息
print(address, conn)

c1.py為客戶端

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

import socket

# 創(chuàng)建一個socket對象
obj = socket.socket()

# 制定服務(wù)端的IP地址和端口
obj.connect(('127.0.0.1', 6254, ))

# 連接完成之后關(guān)閉鏈接
obj.close()

輸出結(jié)果:
服務(wù)端

[root@wangerxiao tmp]# python s1.py 
wait
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6254), raddr=('127.0.0.1', 36106)> ('127.0.0.1', 36106)

客戶端

[root@wangerxiao tmp]# python c1.py 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漩蟆,一起剝皮案震驚了整個濱河市垒探,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怠李,老刑警劉巖圾叼,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛤克,死亡現(xiàn)場離奇詭異,居然都是意外死亡夷蚊,警方通過查閱死者的電腦和手機(jī)构挤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惕鼓,“玉大人筋现,你說我怎么就攤上這事∠淦纾” “怎么了矾飞?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呀邢。 經(jīng)常有香客問我洒沦,道長,這世上最難降的妖魔是什么驼鹅? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任微谓,我火速辦了婚禮,結(jié)果婚禮上输钩,老公的妹妹穿的比我還像新娘。我一直安慰自己仲智,他們只是感情好买乃,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钓辆,像睡著了一般剪验。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上前联,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天功戚,我揣著相機(jī)與錄音,去河邊找鬼似嗤。 笑死啸臀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烁落。 我是一名探鬼主播乘粒,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伤塌!你這毒婦竟也來了灯萍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤每聪,失蹤者是張志新(化名)和其女友劉穎旦棉,沒想到半個月后齿风,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡绑洛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年救斑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诊笤。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡系谐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讨跟,到底是詐尸還是另有隱情纪他,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布晾匠,位于F島的核電站茶袒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凉馆。R本人自食惡果不足惜薪寓,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澜共。 院中可真熱鬧向叉,春花似錦、人聲如沸嗦董。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽京革。三九已至奇唤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匹摇,已是汗流浹背咬扇。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留廊勃,地道東北人懈贺。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像供搀,于是被迫代替她去往敵國和親隅居。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理葛虐,服務(wù)發(fā)現(xiàn)胎源,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 名詞延伸 通俗的說万栅,域名就相當(dāng)于一個家庭的門牌號碼佑钾,別人通過這個號碼可以很容易的找到你。如果把IP地址比作一間房子...
    楊大蝦閱讀 20,602評論 2 57
  • 參考:http://www.2cto.com/net/201611/569006.html TCP HTTP UD...
    F麥子閱讀 2,949評論 0 14
  • 最近在學(xué)習(xí)Python看了一篇文章寫得不錯兽掰,是在腳本之家里的,原文如下徒役,很有幫助: 一孽尽、網(wǎng)絡(luò)知識的一些介紹 soc...
    qtruip閱讀 2,717評論 0 6
  • 原油基準(zhǔn)價 FORTY years ago America, still reeling from the 197...
    加油沖哇閱讀 509評論 0 0