Python 網(wǎng)絡(luò)編程(TCP、UDP)

TCP

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

import socket

# 創(chuàng)建一個socket:AF_INET指IPv4救欧,IPv6為AF_INET6
# SOCK_STREAM指定使用面向流的TCP協(xié)議
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 建立連接: 端口號80是Web服務(wù)的標準端口
# 端口號小于1024的是Internet標準服務(wù)的端口锣光,端口號大于1024的,可以任意使用蹬刷。
s.connect(('www.sina.com.cn', 80))

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

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

data = b''.join(buffer)

# 關(guān)閉連接:
s.close()

header, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))

# 把接收的數(shù)據(jù)寫入文件:
with open('sina.html', 'wb') as f:
    f.write(html)

客戶端、服務(wù)端簡單例子

server

一個Socket依賴4項:服務(wù)器地址办成、服務(wù)器端口、客戶端地址某弦、客戶端端口來唯一確定一個Socket而克。

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

import socket, threading, time

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

# 監(jiān)聽端口:
s.bind(('127.0.0.1', 9999))

# 開始監(jiān)聽端口,傳入的參數(shù)指定等待連接的最大數(shù)量
s.listen(5)
print('Waiting for connection...')


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)

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



client

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

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立連接:
s.connect(('127.0.0.1', 9999))
# 接收歡迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'yzg', b'YZG', b'_YZG_']:
    # 發(fā)送數(shù)據(jù):
    s.send(data)
    print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

server-client

UDP

UDP的使用與TCP類似腾降,但是不需要建立連接碎绎。此外,服務(wù)器綁定UDP端口和TCP端口互不沖突筋帖,也就是說,UDP的9999端口與TCP的9999端口可以各自綁定蚁滋。

server

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

import socket
# SOCK_DGRAM指定了這個Socket的類型是UDP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 綁定端口:
s.bind(('127.0.0.1', 9999))

print('Bind UDP on 9999...')
# 不需要調(diào)用listen()方法赘淮,而是直接接收來自任何客戶端的數(shù)據(jù)
while True:
    # 接收數(shù)據(jù):
    # recvfrom()方法返回數(shù)據(jù)和客戶端的地址與端口,這樣梢卸,服務(wù)器收到數(shù)據(jù)后,直接調(diào)用sendto()就可以把數(shù)據(jù)用UDP發(fā)給客戶端
    data, addr = s.recvfrom(1024)
    print('Received from %s:%s.' % addr)
    reply = 'Hello, %s!' % data.decode('utf-8')
    s.sendto(reply.encode('utf-8'), addr)

client

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

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 不需要調(diào)用connect(),直接通過sendto()給服務(wù)器發(fā)數(shù)據(jù)
for data in [b'yzg', b'YZG', b'_YZG_']:
    # 發(fā)送數(shù)據(jù):
    s.sendto(data, ('127.0.0.1', 9999))
    # 接收數(shù)據(jù):
    # 從服務(wù)器接收數(shù)據(jù)仍然調(diào)用recv()方法
    print(s.recv(1024).decode('utf-8'))

s.close()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塞绿,一起剝皮案震驚了整個濱河市恤批,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖棋返,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雷猪,死亡現(xiàn)場離奇詭異,居然都是意外死亡求摇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門躏惋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚷辅,“玉大人,你說我怎么就攤上這事簸搞。” “怎么了趁俊?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵寺擂,是天一觀的道長。 經(jīng)常有香客問我怔软,道長,這世上最難降的妖魔是什么挡逼? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮嘱能,結(jié)果婚禮上虱疏,老公的妹妹穿的比我還像新娘。我一直安慰自己做瞪,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布衩侥。 她就那樣靜靜地躺著矛物,像睡著了一般茫死。 火紅的嫁衣襯著肌膚如雪履羞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天爱榔,我揣著相機與錄音糙及,去河邊找鬼详幽。 笑死浸锨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的柱搜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宪肖,長吁一口氣:“原來是場噩夢啊……” “哼健爬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浑劳,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衷咽,沒想到半個月后蒜绽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镶骗,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡鼎姊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了相寇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡婆赠,死狀恐怖佳励,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赃承,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布拭嫁,位于F島的核電站,受9級特大地震影響噩凹,放射性物質(zhì)發(fā)生泄漏毡咏。R本人自食惡果不足惜驮宴,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一堵泽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迎罗,春花似錦片仿、人聲如沸纹安。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阳距。三九已至,卻和暖如春卒茬,著一層夾襖步出監(jiān)牢的瞬間船老,已是汗流浹背圃酵。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荸镊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像舀锨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宛逗,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)替蔬,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 1 網(wǎng)絡(luò)編程----TCPNo24 【 public class Server { public static...
    征程_Journey閱讀 1,262評論 0 4
  • 1、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)根悼、netstat -nat 查看TCP各個狀態(tài)的數(shù)量2)、lso...
    北辰青閱讀 9,427評論 0 11
  • 原文轉(zhuǎn)自:Python教程 TCP/IP簡介雖然大家現(xiàn)在對互聯(lián)網(wǎng)很熟悉剩彬,但是計算機網(wǎng)絡(luò)的出現(xiàn)比互聯(lián)網(wǎng)要早很多。 計...
    李牧羊閱讀 926評論 0 5
  • 早上看了一邊文章喉恋,喜歡里面的話語母廷。“感情里最可怕的事徘意,不是爭吵,不是拒絕椎咧,而是沒有回應(yīng)把介。我們常常在親密關(guān)系里感到孤...
    北夜極星閱讀 286評論 0 0