python程式設計16章教程 Python學習筆記

2021-10-19 21:49:51 字數 2816 閱讀 9835

# 這是學習廖雪峰老師python教程的學習筆記

1、客戶端

大多數連線都是可靠的tcp連線。建立tcp連線時,主動發起連線的叫客戶端,被動響應連線的叫伺服器。

# 匯入socket庫:

import socket

# 建立乙個socket,af_inet指定使用ipv4協議,如果是af_inet6,就用pv6

# sock_stream指定使用面向流的tcp協議

s =socket.socket(socket.af_inet, socket.sock_stream)

# 建立連線,引數是乙個tuple,內為 要連線的網域名稱/主機,埠號

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

# 傳送資料,要求返回首頁的內容

# 接收資料:

buffer =

while true:

# 每次最多接收1k位元組:

d = s.recv(1024)

if d:

else:

break

data = b''.join(buffer)

# 資料額接受完後,關閉連線:

s.close()

# 分離http頭和網頁

# \r代表回車,也就是列印頭歸位,回到某一行的開頭。單獨使用\r時,print  ('前面的內容\r只顯示後面的內容')

# \r\n 一起用表換行

header, html = data.split(b'\r\n\r\n', 1)

print(header.decode('utf-8'))

# 把接收的資料寫入sina.html檔案:

with open('sina.html', 'wb') as f:

f.write(html)

注意:雖然tcp連線建立的是雙向通道,雙方都可以同時給對方發資料。但是誰先發誰後發,怎麼協調,要根據具體的協議來決定。例如,http協議規定客戶端必須先發請求給伺服器,伺服器收到後才發資料給客戶端。

2、伺服器

伺服器程序首先要繫結乙個埠並監聽來自其他客戶端的連線。如果某個客戶端連線過來了,伺服器就與該客戶端建立socket連線,隨後的通訊就靠這個socket連線了。不同的對應著不同的固定埠。

每來乙個客戶端連線,就建立該socket連線。由於伺服器會有大量來自客戶端的連線,所以,伺服器要能夠區分乙個socket連線是和哪個客戶端繫結的。乙個socket依賴4項:伺服器位址、伺服器端口、客戶端位址、客戶端埠來唯一確定乙個socket。

伺服器還需要同時響應多個客戶端的請求,所以,每個連線都需要乙個新的程序或者新的執行緒來處理

1.1、編寫乙個簡單的伺服器程式,它接收客戶端連線,把客戶端發過來的字串加上hello再發回去

1)server端

import threading,time,socket

def tcplink(sock, addr):#定義了tcplink函式

print('accept new connection from %s:%s...' % addr) #提示資訊

sock.send(b'welcome!') #給客戶端發welocme

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')) # 將收到的資料,加上hello發回去

sock.close() # 關閉連線

print('connection from %s:%s closed.' % addr) #提示資訊

s = socket.socket(socket.af_inet, socket.sock_stream) #建立socket物件

s.bind(('127.0.0.1', 9999)) # 繫結ip和埠

s.listen(5) # 監聽埠,傳入的引數指定等待連線的最大數量

print('waiting for connection...')

while true:

sock, addr = s.accept() # 接受乙個新連線:

t = threading.thread(target=tcplink, args=(sock, addr)) # 建立新執行緒來處理tcp連線:

t.start()

2)client端

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'michael', b'tracy', b'sarah']:

# 傳送資料:

s.send(data)

print(s.recv(1024).decode('utf-8')) #列印收到的資料

s.send(b'exit') #傳送退出請求

s.close()

客戶端程式執行完畢就退出了,而伺服器程式會永遠執行下去,必須按ctrl+c退出程式

同乙個埠,被乙個socket繫結了以後,就不能被別的socket繫結了。

第16章 網路程式設計

網路通訊協議 計算機網路中實現通訊必須有一些約定,即通訊協議,對速率 傳輸 結構 傳輸控制步驟 出錯控制等制定標準。通訊協議分層的思想 由於結點之間聯絡很複雜,在制定協議時,把複雜成份分解成一些簡單的成份,再將它們復合起來。最常用的復合方式是層次方式,即同層間可以通訊 上一層可以呼叫下一層,而與再下...

第16章 網路程式設計

利用套接字 socket 開發網路應用程式早已被廣泛的採用,以至於成為事實上的標準。通訊的兩端都要有socket,是兩台機器間通訊的端點 網路通訊其實就是socket間的通訊。socket允許程式把網路連線當成乙個流,資料在兩個socket間通過io傳輸。一般主動發起通訊的應用程式屬客戶端,等待通訊...

第16章 網路程式設計 2

16.3 python中的網路程式設計 16.3.1 socket 模組函式 使用socket.socket 函式來建立套接字。socket socket family,socket type,protocol 0 import socket tcpsock socket.socket socket...