python網路程式設計基礎

2021-07-22 13:16:20 字數 4722 閱讀 9090

客戶/伺服器架構

伺服器:是乙個軟體或硬體,用於提供客戶需要的」服務」;伺服器存在的唯一目的就是等待客戶的請求,給這些客戶服務,然後再等待其他的請求.

常見的服務型別:

硬體的客戶/伺服器架構:印表機,檔案伺服器

軟體客戶/伺服器架構: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...