一、簡介
Python是一個很強(qiáng)大的網(wǎng)絡(luò)編程工具
(1)python內(nèi)有很多針對常見網(wǎng)絡(luò)協(xié)議的庫,對網(wǎng)絡(luò)協(xié)議的各個層次進(jìn)行了抽象封裝,因此使用python編寫程序不必關(guān)心網(wǎng)絡(luò)實(shí)現(xiàn)的細(xì)節(jié)
(2)python非常善于處理字節(jié)流的各種模式,使用python可以很容易地寫出處理各種協(xié)議格式的代碼
二、urllib和urllib2
互聯(lián)網(wǎng)基本原理是基于“請求-響應(yīng)”模式,獲取互聯(lián)網(wǎng)上的資源需要發(fā)出請求,即URL(地址)
Python中實(shí)現(xiàn)的urllib和urllib2,功能很強(qiáng)大,通過它們訪問網(wǎng)絡(luò)上的文件,就像訪問本地電腦的文件一樣,兩個模塊的功能都差不多,但urllib2更好一些。
①如果只需要簡單的下載,使用urllib就能夠滿足要求
②如果需要使用HTTP驗(yàn)證cookie或要為自己的協(xié)議編寫擴(kuò)展程序的話,urllib2是更好的選擇
(1)使用urllib.request模塊下載文件,使用urlretrieve()方法
語法:urlretrieve(url,[filename,reporthook])
參數(shù)url代表資源路徑
參數(shù)filename指定本地保存路徑
參數(shù)reporthook是一個回調(diào)函數(shù),當(dāng)連接上服務(wù)器、以及相應(yīng)的數(shù)據(jù)庫傳輸完畢時會觸發(fā)回調(diào),可以利用來顯示下載進(jìn)度
(2)使用urllib2可以像打開本地文件一樣打開遠(yuǎn)程文件,不同之處是只能使用只讀模式,打開遠(yuǎn)程文件使用的方法是urlopen(),傳遞給它的參數(shù)是URL
urlopen()返回一個能從中讀取數(shù)據(jù)的類文件對象,支持多種方法:read、readline、readlines、close

獲取到的信息結(jié)構(gòu)類似一個有兩層的字典,最外層只有一個鍵“weatherinfo”,它的值是另外一個字典,里面包含了很多天氣信息,這種數(shù)據(jù)結(jié)構(gòu)被稱為“json格式”
(3)Json
Json是一種輕量級的數(shù)據(jù)交換格式,是一種完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C、C++、C#、Java、Python等),這些特性使json成為了理想的數(shù)據(jù)交換語言
Python標(biāo)準(zhǔn)庫中也包含了json模塊,模塊中的一些方法能幫助更好的處理這種json格式的數(shù)據(jù),例如通過loads方法就能將json數(shù)據(jù)轉(zhuǎn)換成真正的字典
三、socket
套接字(socket)是網(wǎng)絡(luò)編程中的一個基本組件,是兩個端點(diǎn)的程序之間的“信息通道”
套接字包括兩個:服務(wù)器套接字和客戶端套接字
無論是服務(wù)器還是客戶端,都首先需要調(diào)用socket模塊中的socket()方法來創(chuàng)建socket對象
(1)格式
socket()方法的格式:socket(family,type)
Family 參數(shù)代表地址家族,可以是AF_INET或AF_UNIX,AF_INET 代表IPv4地址,AF_UNIX只能用于單一的Unix系統(tǒng)進(jìn)程間通信
type參數(shù)代表套接字類型,可以是SOCK_STREAM或SOCK_DGRAM,SOCK_STREAM代表流套接字,應(yīng)用于TCP,SOCK_DGRAM代表數(shù)據(jù)報套接字,應(yīng)用于UDP
(2)流套接字和數(shù)據(jù)報套接字的區(qū)別
1、流套接字區(qū)分服務(wù)器和客戶端,數(shù)據(jù)報套接字不區(qū)分
2、流套接字適合傳輸數(shù)據(jù)量大的,數(shù)據(jù)報套接字適合傳輸數(shù)據(jù)量小的
3、客戶的流套接字單向傳遞,數(shù)據(jù)報套接字可以接收任何方向的數(shù)據(jù),并可以向任何地址發(fā)送數(shù)據(jù)報
4、流套接字使用時不需考慮底層細(xì)節(jié),依靠TCP協(xié)議進(jìn)行可靠的數(shù)據(jù)傳輸
?? 數(shù)據(jù)報套接字依靠UDP協(xié)議,數(shù)據(jù)傳輸效率高,但需要考慮底層細(xì)節(jié),在代碼中保證數(shù)據(jù)的可靠傳輸
5、流套接字依靠TCP協(xié)議建立好連接后發(fā)送數(shù)據(jù),不需要指定地址
?? 數(shù)據(jù)報套接字依靠UDP協(xié)議發(fā)送數(shù)據(jù),每次都需要指定發(fā)送給誰
四、服務(wù)器socket函數(shù)
bind(address)方法將套接字綁定到地址,參數(shù)address以元組(host,port)的形似表示地址
listen(backlog)方法開始監(jiān)聽TCP傳入連接,參數(shù)backlog為操作系統(tǒng)可以掛起的最大連接數(shù),至少為1-5
accept()方法接收TCP連接并返回元組(conn,address),conn是新的socket對象,服務(wù)器必須通過它與客戶通信,address是客戶的地址
編寫服務(wù)端socket思路:
1、創(chuàng)建套接字,綁定套接字到本地IP和端口
2、開始監(jiān)聽連接
3、進(jìn)入循環(huán),不斷接收客戶端的請求
4、接收傳來的數(shù)據(jù),并發(fā)送給對方數(shù)據(jù)
5、傳輸完畢后,關(guān)閉套接字

五、客戶端socket函數(shù)
connect(address)方法連接到指定地址的套接字,參數(shù)address格式為元組(host,port)地址
connect_ex(address)方法與connect()方法相同,但是成功返回0,失敗返回errno
編寫客戶端socket思路:
1、創(chuàng)建套接字,連接服務(wù)器地址
2、連接后發(fā)送和接收數(shù)據(jù)
3、傳輸完畢后,關(guān)閉套接字

六、公共socket函數(shù)
recv(bufsize)接收TCP數(shù)據(jù),參數(shù)bufsize指定接收的最大數(shù)據(jù)量,結(jié)果以字符串形式返回
send(string)發(fā)送TCP數(shù)據(jù),參數(shù)string是字符串,返回值是要發(fā)送的數(shù)據(jù)量
sendall(string)完整發(fā)送TCP數(shù)據(jù),在返回之前會嘗試發(fā)送所有數(shù)據(jù)
recvfrom(bufsize)接收UDP數(shù)據(jù),返回值是(data,address),address指明發(fā)送方地址
sendto(string,address)發(fā)送UDP數(shù)據(jù),參數(shù)中也需指明address(接收方地址)
settimeout(timeout)設(shè)置套接字操作的超時時間,參數(shù)timeout是浮點(diǎn)數(shù),單位為秒
close()關(guān)閉套接字