Python學(xué)習(xí)之網(wǎng)絡(luò)編程

Python學(xué)習(xí)目錄

  1. 在Mac下使用Python3
  2. Python學(xué)習(xí)之?dāng)?shù)據(jù)類(lèi)型
  3. Python學(xué)習(xí)之函數(shù)
  4. Python學(xué)習(xí)之高級(jí)特性
  5. Python學(xué)習(xí)之函數(shù)式編程
  6. Python學(xué)習(xí)之模塊
  7. Python學(xué)習(xí)之面向?qū)ο缶幊?/a>
  8. Python學(xué)習(xí)之面向?qū)ο蟾呒?jí)編程
  9. Python學(xué)習(xí)之錯(cuò)誤調(diào)試和測(cè)試
  10. Python學(xué)習(xí)之IO編程
  11. Python學(xué)習(xí)之進(jìn)程和線程
  12. Python學(xué)習(xí)之正則
  13. Python學(xué)習(xí)之常用模塊
  14. Python學(xué)習(xí)之網(wǎng)絡(luò)編程

互聯(lián)網(wǎng)的實(shí)現(xiàn)然爆,分成好幾層载萌。每一層都有自己的功能控嗜,就像建筑物一樣诸狭,每一層都靠下一層支持。如何分層有不同的模型,有的模型分七層,有的分四層私沮。我覺(jué)得始赎,把互聯(lián)網(wǎng)分成五層和橙,比較容易解釋。最底下的一層叫做"實(shí)體層"(Physical Layer)造垛,最上面的一層叫做"應(yīng)用層"(Application Layer)魔招,中間的三層(自下而上)分別是"鏈接層"(Link Layer)、"網(wǎng)絡(luò)層"(Network Layer)和"傳輸層"(Transport Layer)五辽。越下面的層办斑,越靠近硬件;越上面的層杆逗,越靠近用戶(hù)乡翅。

TCP編程

Socket是網(wǎng)絡(luò)編程的一個(gè)抽象概念。通常我們用一個(gè)Socket表示“打開(kāi)了一個(gè)網(wǎng)絡(luò)鏈接”罪郊,而打開(kāi)一個(gè)Socket需要知道目標(biāo)計(jì)算機(jī)的IP地址和端口號(hào)蠕蚜,再指定協(xié)議類(lèi)型即可。

客戶(hù)端

創(chuàng)建Socket

# 導(dǎo)入socket庫(kù):
import socket

# 創(chuàng)建一個(gè)socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立連接:
s.connect(('www.sina.com.cn', 80))

創(chuàng)建Socket時(shí)悔橄,AF_INET指定使用IPv4協(xié)議靶累,如果要用更先進(jìn)的IPv6腺毫,就指定為AF_INET6SOCK_STREAM指定使用面向流的TCP協(xié)議挣柬,這樣潮酒,一個(gè)Socket對(duì)象就創(chuàng)建成功,但是還沒(méi)有建立連接邪蛔。

連接服務(wù)器

s.connect(('www.sina.com.cn', 80))

注意參數(shù)是一個(gè)tuple急黎,包含地址和端口號(hào)。

發(fā)送請(qǐng)求

# 發(fā)送數(shù)據(jù):
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')

TCP連接創(chuàng)建的是雙向通道侧到,雙方都可以同時(shí)給對(duì)方發(fā)數(shù)據(jù)叁熔。但是誰(shuí)先發(fā)誰(shuí)后發(fā),怎么協(xié)調(diào)床牧,要根據(jù)具體的協(xié)議來(lái)決定荣回。例如,HTTP協(xié)議規(guī)定客戶(hù)端必須先發(fā)請(qǐng)求給服務(wù)器戈咳,服務(wù)器收到后才發(fā)數(shù)據(jù)給客戶(hù)端心软。

接收數(shù)據(jù)

# 接收數(shù)據(jù):
buffer = []
while True:
    # 每次最多接收1k字節(jié):
    d = s.recv(1024)
    if d:
        buffer.append(d)
    else:
        break
data = b''.join(buffer)

關(guān)閉Socket

# 接收數(shù)據(jù):
buffer = []
while True:
    # 每次最多接收1k字節(jié):
    d = s.recv(1024)
    if d:
        buffer.append(d)
    else:
        break
data = b''.join(buffer)

服務(wù)器

創(chuàng)建Socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

創(chuàng)建一個(gè)基于IPv4和TCP協(xié)議的Socket。

綁定監(jiān)聽(tīng)的地址和端口

# 監(jiān)聽(tīng)端口:
s.bind(('127.0.0.1', 9999))
s.listen(5)
print('Waiting for connection...')

listen()方法傳入的參數(shù)指定等待連接的最大數(shù)量著蛙。

接受客戶(hù)端連接

while True:
    # 接受一個(gè)新連接:
    sock, addr = s.accept()
    # 創(chuàng)建新線程來(lái)處理TCP連接:
    t = threading.Thread(target=tcplink, args=(sock, addr))
    t.start()

每個(gè)連接都必須創(chuàng)建新線程(或進(jìn)程)來(lái)處理删铃,否則,單線程在處理連接的過(guò)程中踏堡,無(wú)法接受其他客戶(hù)端的連接:

def tcplink(sock, addr):
    print('Accept new connection from %s:%s...' % addr)
    sock.send(b'Welcome!')
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if not data or data.decode('utf-8') == 'exit':
            break
        sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
    sock.close()
    print('Connection from %s:%s closed.' % addr)

UDP編程

TCP是建立可靠連接猎唁,并且通信雙方都可以以流的形式發(fā)送數(shù)據(jù)。相對(duì)TCP顷蟆,UDP則是面向無(wú)連接的協(xié)議诫隅。

使用UDP協(xié)議時(shí),不需要建立連接帐偎,只需要知道對(duì)方的IP地址和端口號(hào)逐纬,就可以直接發(fā)數(shù)據(jù)包。但是削樊,能不能到達(dá)就不知道了豁生。

雖然用UDP傳輸數(shù)據(jù)不可靠,但它的優(yōu)點(diǎn)是和TCP比漫贞,速度快甸箱,對(duì)于不要求可靠到達(dá)的數(shù)據(jù),就可以使用UDP協(xié)議迅脐。

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定端口:
s.bind(('127.0.0.1', 9999))

創(chuàng)建Socket時(shí)芍殖,SOCK_DGRAM指定了這個(gè)Socket的類(lèi)型是UDP。綁定端口和TCP一樣仪际,但是不需要調(diào)用listen()方法围小,而是直接接收來(lái)自任何客戶(hù)端的數(shù)據(jù):

print('Bind UDP on 9999...')
while True:
    # 接收數(shù)據(jù):
    data, addr = s.recvfrom(1024)
    print('Received from %s:%s.' % addr)
    s.sendto(b'Hello, %s!' % data, addr)

recvfrom()方法返回?cái)?shù)據(jù)和客戶(hù)端的地址與端口昵骤,這樣,服務(wù)器收到數(shù)據(jù)后肯适,直接調(diào)用sendto()就可以把數(shù)據(jù)用UDP發(fā)給客戶(hù)端变秦。

注意這里省掉了多線程,因?yàn)檫@個(gè)例子很簡(jiǎn)單框舔。

客戶(hù)端使用UDP時(shí)蹦玫,首先仍然創(chuàng)建基于UDP的Socket,然后刘绣,不需要調(diào)用connect()樱溉,直接通過(guò)sendto()給服務(wù)器發(fā)數(shù)據(jù):

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:
    # 發(fā)送數(shù)據(jù):
    s.sendto(data, ('127.0.0.1', 9999))
    # 接收數(shù)據(jù):
    print(s.recv(1024).decode('utf-8'))
s.close()

從服務(wù)器接收數(shù)據(jù)仍然調(diào)用recv()方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纬凤,一起剝皮案震驚了整個(gè)濱河市福贞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌停士,老刑警劉巖挖帘,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異恋技,居然都是意外死亡拇舀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)蜻底,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)骄崩,“玉大人,你說(shuō)我怎么就攤上這事薄辅∫鳎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵长搀,是天一觀的道長(zhǎng)宇弛。 經(jīng)常有香客問(wèn)我鸡典,道長(zhǎng)源请,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任彻况,我火速辦了婚禮谁尸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纽甘。我一直安慰自己良蛮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布悍赢。 她就那樣靜靜地躺著决瞳,像睡著了一般货徙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上皮胡,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天痴颊,我揣著相機(jī)與錄音,去河邊找鬼屡贺。 笑死蠢棱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甩栈。 我是一名探鬼主播泻仙,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼量没!你這毒婦竟也來(lái)了玉转?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤殴蹄,失蹤者是張志新(化名)和其女友劉穎冤吨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體饶套,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漩蟆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妓蛮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怠李。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛤克,靈堂內(nèi)的尸體忽然破棺而出捺癞,到底是詐尸還是另有隱情,我是刑警寧澤构挤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布髓介,位于F島的核電站,受9級(jí)特大地震影響筋现,放射性物質(zhì)發(fā)生泄漏唐础。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一矾飞、第九天 我趴在偏房一處隱蔽的房頂上張望一膨。 院中可真熱鬧,春花似錦洒沦、人聲如沸豹绪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瞒津。三九已至蝉衣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巷蚪,已是汗流浹背买乃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钓辆,地道東北人剪验。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像前联,于是被迫代替她去往敵國(guó)和親功戚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355