套接字模組是乙個非常簡單的基於物件的介面,它提供對低層
bsd套接字樣式網路的訪問。使用該模組可以實現客戶機和伺服器套接字。要在
python
中建立具有
tcp和流套接字的簡單伺服器,需要使用
socket
模組。利用該模組包含的函式和類定義,可生成通過網路通訊的程式。
建立乙個
tcp伺服器連線需要
6個步驟:
1.
建立
socket
物件。呼叫
socket
建構函式:
socket=socket.socket(familly,type)
family
的值可以是
af_unix(unix
域,用於同一臺機器上的程序間通訊
),也可以是
af_inet
(對於ipv4
協議的tcp
和 udp
),至於
type
引數,sock_stream
(流套接字)或者
sock_dgram
(資料報文套接字)
,sock_raw
(raw
套接字)。
2.
將
socket
繫結(指派)到指定位址上,
socket.bind(address)
address
必須是乙個雙元素元組
,((host,port)),
主機名或者
ip位址
+埠號。如果埠號正在被使用或者保留,或者主機名或
ip位址錯誤,則引發
socke.error
異常。3.
繫結後,必須準備好套接字,以便接受連線請求。
socket.listen(backlog)
backlog
指定了最多連線數,至少為
1,接到連線請求後,這些請求必須排隊,如果佇列已滿,則拒絕請求。
4.
伺服器套接字通過
socket
的accept
方法等待客戶請求乙個連線:
connection,address=socket.accept()
呼叫accept
方法時,
socket
會進入'waiting'
(或阻塞)狀態。客戶請求連線時,方法建立連線並返回伺服器。
accept
方法返回乙個含有倆個元素的元組,形如
(connection,address)
。第乙個元素(
connection
)是新的
socket
物件,伺服器通過它與客戶通訊;第二個元素(
address
)是客戶的
internet
位址。5.
處理階段,伺服器和客戶通過
send
和recv
方法通訊(傳輸資料)。
伺服器呼叫
send
,並採用字串形式向客戶傳送資訊。
send
方法返回已傳送的字元個數。伺服器使用
recv
方法從客戶接受資訊。呼叫
recv
時,必須指定乙個整數來控制本次呼叫所接受的最大資料量。
recv
方法在接受資料時會進入
'blocked'
狀態,最後返回乙個字串,用它來表示收到的資料。如果傳送的量超過
recv
所允許,資料會被截斷。多餘的資料將緩衝於接受端。以後呼叫
recv
時,多餘的資料會從緩衝區刪除。
6.
傳輸結束,伺服器呼叫
socket
的close
方法以關閉連線。
tcp伺服器端設計(偽碼流程):
ss = socket()
ss.bind()
ss.listen()
inf_loop:
cs = ss.accept()
comm_loop:
cs.recv()/cs.send()
cs.close()
ss.close()
示例**一(時間戳伺服器tstserv.py):
#! /usr/bin/env python
#coding=utf-8
from socket import *
from time import ctime
host = ''
port = 21567
bufsize = 1024
addr = (host,port)
tcpservsock = socket(af_inet,sock_stream)
tcpservsock.bind(addr)
tcpservsock.listen(5)
while 1:
print('waiting for connection...')
tcpclisock,addr = tcpservsock.accept()
print('...connected from :',addr)
while 1:
data = tcpclisock.recv(bufsize)
if not data:
break
tcpclisock.send('[%s] %s' %(ctime(),data))
tcpclisock.close()
tcpservsock.close()
建立乙個tcp客戶端連線則需要
4個步驟:
1.建立乙個
socket
以連線伺服器
socket=socket.socket(family,type)
2. 使用
socket
的connect
方法連線伺服器
socket.connect((host,port))
3. 客戶和伺服器通過
send
和recv
方法通訊。
4. 結束後,客戶通過呼叫
socket
的close
方法來關閉連線。
tcp客戶端設計(偽碼流程):
cs = socket()
cs.connect()
comm_loop:
cs.send()/cs.recv()
cs.close()
示例**二(時間戳客戶端tstclnt.py):
#! /usr/bin/env python
#coding=utf-8
from socket import *
host = 'localhost'
port = 21567
bufsize = 1024
addr = (host,port)
tcpclisock = socket(af_inet,sock_stream)
tcpclisock.connect(addr)
while 1:
data = raw_input('> ')
if not data:
break
tcpclisock.send(data)
data = tcpclisock.recv(bufsize)
if not data:
break
print(data)
tcpclisock.close()
執行結果:
ref:
1,core python programming
2,
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...