# 這是學習廖雪峰老師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...