客戶/伺服器架構
伺服器:是乙個軟體或硬體,用於提供客戶需要的」服務」;伺服器存在的唯一目的就是等待客戶的請求,給這些客戶服務,然後再等待其他的請求.
常見的服務型別:
硬體的客戶/伺服器架構:印表機,檔案伺服器
軟體客戶/伺服器架構:web伺服器,資料庫伺服器,視窗伺服器(gui)
套接字:用於程序間通訊(ipc)
兩個家族的套接字:
(1)af_unix:位址家族,基於檔案,底層結構有檔案系統來支援.
(2)af_inet:基於網路
埠號範圍:0~65535,保留埠號:0~1023;
unix可以通過/etc/services檢視保留埠號
傳輸控制協議tcp:面向連線
使用者資料報協議(udp):無連線
socket()模組函式
使用socket.socket()建立套接字
socket(socket_family,socket_type,protocol=0)
socket_family可以是af_unix或af_inet,
socket_type可以是sock_stream或sock_dgram
protocol一般不填,預設為0
匯入socket模組:
from socket import *
建立乙個tcp/ip套接字:
tcpsock=socket(socket.af_inet,socket.sock_stream)
建立乙個udp/ip套接字:
udpsock=socket(socket.af_inet,socket.sock_dgram)
套接字常用函式:
伺服器段套接字函式:
s.bind() 繫結位址(主機,埠號對)到套接字
s.listen() 開始tcp監聽
s.accept() 被動接受tcp客戶的連線,(阻塞式)等待連線的到來
客戶端套接字函式:
s.connect() 主動初始化tcp伺服器連線
s.connect_ex() connect()的擴充套件版本,出錯時返回出錯碼,而不是拋異常
s.recv() 接受tcp資料
s.send() 傳送tcp資料
s.sendall() 完整傳送tcp資料
s.recvfrom() 接收udp資料
s.sendto() 傳送udp資料
s.getpeername() 連線當前套接字的遠端位址
s.getsockname() 當前套接字的位址
s.getsockopt() 返回指定套接字的引數
s.setsockopt() 設定指定套接字的引數
s.close() 關閉套接字
blocking-oriented socket methods
s.setblocking() 設定套接字的阻塞與飛阻塞模式
s.settimeout() 設定阻塞套接字操作的超時時間
s.gettimeout() 得到阻塞套接字操作的超時時間
面向檔案的套接字的函式
s.fileno() 套接字的檔案描述符
s.makefile() 建立乙個與該套接字關聯的檔案
伺服器的一般動作流程:偽**
ss=socket() #建立伺服器套接字
ss.bind() #把位址繫結到套接字上,乙個套接字對應乙個埠號,設定完成才可以進入無限迴圈
ss.listen() #監聽連線
inf_loop:
cs=ss.accept() #接收客戶的連線,會返回乙個單獨的客戶套接字使用者後續通訊
comn_loop: #通訊迴圈
cs.recv()/cs.send() #對話
cs.close()
ss.close()
客戶端的一般動作:偽**
cs.socket() #建立客戶套接字
cs.connect() #嘗試連線伺服器
comm_loop: #通訊迴圈
cs.send()/cs.recv() #對話(傳送/接收)
cs.close()
例項:
tcp簡單伺服器端**
#!/usr/bin/env python
# encoding: utf-8
from socket import *
from time import ctime
host=''
port=21567
bufsize=1024
addr=(host,port)
tcpsersock=socket(af_inet,sock_stream)
tcpsersock.bind(addr)
tcpsersock.listen(5)
while true:
print
'waiting for connection...'
tcpclisock,addr=tcpsersock.accept()
print
'...connected from:',addr
while true:
data =tcpclisock.recv(bufsize)
ifnot data:
break
tcpclisock.send('[%s]%s' % (ctime(),data))
tcpclisock.close()
tcpsersock.close()
tcp簡單客戶端**
#!/usr/bin/env python
# encoding: utf-8
from socket import *
host='localhost'
port=21567
bufsiz=1024
addr=(host,port)
tcpclisock=socket(af_inet,sock_stream)
tcpclisock.connect(addr)
while
true:
data=raw_input('>')
if not data:
break
tcpclisock.send(data)
data=tcpclisock.recv(bufsiz)
if not data:
break
print data
tcpclisock.close()
友好地退出,呼叫伺服器的close()函式
將伺服器無限迴圈放進try-except語句中,捕獲eoferror和keyboardinterrupt異常,處理字句中呼叫close()
建立乙個udp伺服器一般步驟:
ss.socket() #建立乙個伺服器套接字
ss.bind() #繫結伺服器套接字
inf_loop: 伺服器無限迴圈
cs=ss.recvfrom()/ss.sendto() #對話
ss.close() #關閉套接字
伺服器例子:
#!/usr/bin/env python
from socket import *
from time import ctime
host=''
port=21567
bufsiz=1024
addr=(host,port)
udpsersock=socket(af_inet,sock_dgram)
udpsersock.bind(addr)
while
true:
print
'waiting for message...'
data,addr=udpsersock.recvfrom(bufsiz)
udpsersock.sendto('[%s]%s'%(ctime(),data),addr)
print
'...received from and returned to:',addr
udpsersock.close()
udp客戶端
cs=socket() #建立客戶套接字
comm_loop: #通訊迴圈
cs.sendto()/cs.recvfrom() #對話(傳送/接收)
cs.close() #關閉客戶套接字
簡單udp客戶端**
#!/usr/bin/env python
from socket import *
host='localhost'
port=21567
bufsiz=1024
addr=(host,port)
udpclisock=socket(af_inet,sock_dgram)
while
true:
data=raw_input('>')
if not data:
break
udpclisock.sendto(data,addr)
data,addr=udpclisock.recvfrom(bufsiz)
if not data:
break
print data
udpclisock.close()
socket模組的屬性
serversocket
python 網路程式設計基礎
python實在是太方便,太易用了,三方庫的支援又全,語法又簡單,對開發人員來說,實在是居家旅行,x的必備利器。週末研究了下python的網路支援,做一下記錄,以備隨後翻閱。python支援bsd的socket進行網路程式設計,其api跟c中的大同小異,先看看tcp方式的,說到網路程式設計,肯定會設...
python網路程式設計基礎
目錄 標籤 空格分隔 網路程式設計 目錄tcp和udp tcp的使用是面向連線的,即資料的傳輸必須基於虛鏈路的完整建立。虛鏈路的建立提供了很多優秀的功能,比如確認重傳以保證資料的完整性,滑動視窗以保證資料傳輸的高效性,各類選項字段提供不同的可選功能。tcp的缺點是報頭大,因為需要包含比udp更多的功...
Python網路程式設計基礎
應用socket 的常用方法 socket 介紹 socket套接字 python 中提供了socket.py標準庫,非常底層的介面 socket是一種通用的網路程式設計介面,和網路層次沒有一一對應的關係 協議族af表示address family,用於socket 第乙個引數 名稱含義 af in...