socket是網路程式設計的乙個抽象概念。通常我們用乙個socket表示「開啟了乙個網路鏈結」,而開啟乙個socket需要知道目標計算機的ip位址和埠號,再指定協議型別即可。操作步驟建立socket
建立連線
接收服務端資料
傳送資料
斷開連線
# 客戶端**
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'michael'
, b'tracy'
, b'sarah']:
# 傳送資料:
s.send(data)
print
(s.recv(
1024
).decode(
'utf-8'))
s.send(b'exit'
)s.close(
)
操作步驟建立socket
繫結監聽埠
多執行緒接收客戶端連線
資料接收與傳送
import socket,threading,time
s = socket.socket(socket.af_inet, socket.sock_stream)
# 監聽埠:
s.bind(
('127.0.0.1'
,9999))
s.listen(5)
print
('waiting for connection...'
)# 每個連線都必須建立新執行緒(或程序)來處理,
# 否則,單執行緒在處理連線的過程中,無法接受其他客戶端的連線:
deftcplink
(sock, addr)
:print
('accept new connection from %s:%s...'
% addr)
sock.send(b'welcome!'
)while
true
: data = sock.recv(
1024
) time.sleep(1)
ifnot 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(
)# 建立新執行緒來處理tcp連線:
t = threading.thread(target=tcplink, args=
(sock, addr)
) t.start(
)
執行截圖
服務端:
客戶端:
tcp是建立可靠連線,並且通訊雙方都可以以流的形式傳送資料。相對tcp,udp則是面向無連線的協議。
使用udp協議時,不需要建立連線,只需要知道對方的ip位址和埠號,就可以直接發資料報。但是,能不能到達就不知道了。
雖然用udp傳輸資料不可靠,但它的優點是和tcp比,速度快,對於不要求可靠到達的資料,就可以使用udp協議。
我們來看看如何通過udp協議傳輸資料。和tcp類似,使用udp的通訊雙方也分為客戶端和伺服器。伺服器首先需要繫結埠:
s = socket.socket(socket.af_inet, socket.sock_dgram)
# 繫結埠:
s.bind(
('127.0.0.1'
,9999
))
建立socket時,sock_dgram
指定了這個socket的型別是udp。繫結埠和tcp一樣,但是不需要呼叫listen()
方法,而是直接接收來自任何客戶端的資料:
print
('bind udp on 9999...'
)while
true
:# 接收資料:
data, addr = s.recvfrom(
1024
)print
('received from %s:%s.'
% addr)
s.sendto(b'hello, %s!'
% data, addr)
recvfrom()
方法返回資料和客戶端的位址與埠,這樣,伺服器收到資料後,直接呼叫sendto()
就可以把資料用udp發給客戶端。
客戶端使用udp時,首先仍然建立基於udp的socket,然後,不需要呼叫connect()
,直接通過sendto()
給伺服器發資料:
s = socket.socket(socket.af_inet, socket.sock_dgram)
for data in
[b'michael'
, b'tracy'
, b'sarah']:
# 傳送資料:
s.sendto(data,
('127.0.0.1'
,9999))
# 接收資料:
print
(s.recv(
1024
).decode(
'utf-8'))
s.close(
)
從伺服器接收資料仍然呼叫recv()
方法。 Python TCP程式設計
tcp 對於tcp,我想大部分同學不會陌生。tcp是乙個網路層協議,通過tcp可以建立客戶端到伺服器的連線,並相互傳遞資料。那麼在python中如何使用tcp來做一些操作呢?socket socket在網路程式設計中,是乙個抽象概念。我們用socket來表示開啟了乙個從客戶端到伺服器或者從伺服器到客...
Python tcp程式設計
1 客戶端 coding utf 8 udp穩定性不好,tcp對包有檢查建立通道 建立連線 上傳流量以部分是上傳的應答 這之中還包括超時重傳,錯誤校驗,流量控制和阻塞管理。檔案分塊傳輸 import socket def main 1.建立tcp的套接字 tcp socket socket.sock...
python TCP程式設計再試牛刀
該示例演示的是c s服務模型,server端接收來自客戶端的請求,然後只是很簡單地給客戶端返回 hello 來自客戶端的原文。核心在於兩端socket的建立和連線以及資料的傳送和接收。server端 server.py coding utf 8 created on 2016年8月3日 author...