網路程式設計主要的工作就是在傳送端將資訊通過指定的協議進行組裝包,在接收端按照規定好的協議對包進行解析並提取出對應的資訊,最終達到通訊的目的。傳輸協議主要有 tcp 和 udp,tcp 需要建立連線,是可靠的、基於位元組流的協議,通常與 ip 協議共同使用;udp 不需要建立連線,可靠性差,但速度更快。
網路程式設計有乙個重要的概念 socket(套接字),應用程式可以通過它傳送或接收資料,套接字允許應用程式將 i/o 插入到網路中,並與網路中的其他應用程式進行通訊。
python 提供了如下兩個 socket 模組:
python 中通過 socket() 函式來建立套接字物件,具體格式如下:
socket.socket(family=af_inet, type=sock_stream, proto=0, fileno=none)
套接字物件服務端方法:
方法描述
bind(address)
將套接字繫結到位址,在 af_inet 下以元組 (host,port) 的形式表示位址
listen([backlog])
開始監聽 tcp 傳入連線,backlog 指定在拒絕連線之前,作業系統可以掛起的最大連線數量,至少為1,大部分應用程式設為 5 就可以了
accept()
接受 tcp 連線並返回 (conn,address),conn 是新的套接字物件,可以用來接收、傳送資料,address 是連線客戶端的位址
套接字物件客戶端方法:
方法描述
connect(address)
連線到 address 處的套接字,格式一般為元組 (hostname,port),如果連線出錯,返回 socket.error 錯誤
connect_ex(address)
功能與 connect(address) 相同,但是成功返回 0,失敗返回 errno 的值
套接字物件公用方法:
方法描述
recv(bufsize[, flags])
接受 tcp 套接字的資料,資料以字串形式返回,bufsize 指定要接收的最大資料量,flag 提供有關訊息的其他資訊,通常可以忽略
send(bytes[, flags])
傳送 tcp 資料,將 string 中的資料傳送到連線的套接字,返回值是要傳送的位元組數量,該數量可能小於 string 的位元組大小
sendall(bytes[, flags])
完整傳送 tcp 資料,將 string 中的資料傳送到連線的套接字,但在返回之前會嘗試傳送所有資料,成功返回 none,失敗則丟擲異常
recvfrom(bufsize[, flags])
接受 udp 套接字的資料,與 recv() 類似,但返回值是 (data,address),其中 data 是包含接收資料的字串,address 是傳送資料的套接字位址
sendto(bytes, flags, address)
傳送 udp 資料,將資料傳送到套接字,address 是形式為 (ipaddr,port) 的元組,指定遠端位址,返回值是傳送的位元組數
close()
關閉套接字
getpeername()
返回連線套接字的遠端位址,型別通常是元組 (ipaddr,port)
getsockname()
返回套接字自己的位址,通常是乙個元組 (ipaddr,port)
setsockopt(level,optname,value)
設定給定套接字選項的值
getsockopt(level, optname[, buflen])
返回套接字選項的值
settimeout(value)
設定套接字操作的超時時間,單位是秒
gettimeout()
返回當前超時時間
fileno()
返回套接字的檔案描述符
setblocking(flag)
如果 flag 為 0,則將套接字設為非阻塞模式,否則將套接字設為阻塞模式(預設值);非阻塞模式下,如果呼叫 recv() 沒有發現任何資料或 send() 呼叫無法立即傳送資料,那麼將引起 socket.error 異常
makefile()
建立乙個與該套接字相關連的檔案
我們來看一下如何通過 socket 以 tcp 方式進行通訊。
服務端基本思路:
具體**實現如下:
import socket
# 建立套接字
s = socket.socket(socket.af_inet, socket.sock_stream)
# 繫結位址
s.bind(
('127.0.0.1'
,6666))
# 監聽連線
s.listen(5)
while
true
:print
('等待客戶端傳送資訊...'
)# 接收連線
sock, addr = s.accept(
)# 接收請求資料
data = sock.recv(
1024
).decode(
'utf-8'
)print
('服務端接收請求資料:'
+ data)
# 傳送響應資料
sock.sendall(data.upper(
).encode(
'utf-8'))
# 關閉
sock.close(
)
客戶端基本思路:
具體**實現如下:
import socket
s = socket.socket(socket.af_inet, socket.sock_stream)
# 連線服務端
s.connect(
('127.0.0.1'
,6666))
# 向服務端傳送資料
s.sendall(b'hello'
)# 接受服務端響應資料
data = s.recv(
1024
)print
('客戶端接收響應資料:'
+ data.decode(
'utf-8'))
# 關閉
s.close(
)
我們只需先執行服務端**,再執行客戶端**即可。
我們再來看一下如何通過 socket 以 udp 方式進行通訊。
服務端基本思路:
具體**實現如下:
import socket
# 建立套接字
s = socket.socket(socket.af_inet, socket.sock_dgram)
# 繫結位址
s.bind(
('127.0.0.1'
,6666))
while
true
:# 接收資料
data, addr = s.recvfrom(
1024
)print
('服務端接收請求資料:'
+ data.decode(
'utf-8'))
# 響應資料
s.sendto(data.decode(
'utf-8'
).upper(
).encode(
'utf-8'
), addr)
客戶端基本思路:
具體**實現如下:
import socket
# 建立套接字
s = socket.socket(socket.af_inet, socket.sock_dgram)
# 向服務端傳送資料
s.sendto(b'hello',(
'127.0.0.1'
,6666))
# 接受服務端響應資料
data = s.recv(
1024
).decode(
'utf-8'
)print
('客戶端接收響應資料:'
+ data)
# 關閉
s.close(
)
同樣的,我們還是先執行服務端**,再執行客戶端**即可。
java語言程式設計 高階篇(十)網路
1.網際網路協議 tcp協議 稱為傳輸控制協議,可以檢測資料丟失,並重新傳輸,所以傳輸是無損而可靠的 資料報協議 udp 協議是基於包傳輸資料的,不能保證傳輸是無損的。2.要建立乙個伺服器,使用new seversocket port 來建立乙個伺服器套接字,使用accept 方法來監聽請求啟動伺服...
java高階(三) 網路程式設計
osi模型層次結構圖 從上圖中可以看見,osi模型共分7層,每層的名稱和功能從上圖中都有簡單的解釋,在此不再贅述。1 ip位址 tcp ip tcp ip是一組用於用於實現網路互聯的通訊協議。internet網路體系結構以tcp ip為核心。基於tcp ip的參考模型將協議分為四個層次,分別是 網路...
python網路 Python3 網路程式設計
python3 網路程式設計 python 提供了兩個級別訪問的網路服務。低階別的網路服務支援基本的 socket,它提供了標準的 bsd sockets api,可以訪問底層作業系統socket介面的全部方法。高階別的網路服務模組 socketserver,它提供了伺服器中心類,可以簡化網路伺服器...