Python網(wǎng)絡(luò)編程詳解
1、服務(wù)器就是一系列硬件或軟件,為一個或多個客戶端(服務(wù)的用戶)提供所需的“服務(wù)”。它存在唯一目的就是等待客戶端的請求,并響應(yīng)它們(提供服務(wù)),然后等待更多請求。
2、客戶端/服務(wù)器架構(gòu)既可以應(yīng)用于計算機硬件,也可以應(yīng)用于計算機軟件。
3、在服務(wù)器響應(yīng)客戶端之前,首先會創(chuàng)建一個通信節(jié)點,它能夠使服務(wù)器監(jiān)聽請求。
一、套接字:通信端點
1、套接字
套接字是計算機網(wǎng)絡(luò)數(shù)據(jù)結(jié)構(gòu),它體現(xiàn)了上節(jié)中所描述的“通信端點”的概念。在任何類型的通信開始之前,網(wǎng)絡(luò)應(yīng)用程序必須創(chuàng)建套接字。
有兩種類型的套接字:基于文件和面向網(wǎng)絡(luò)的。
2、套接字地址:主機-端口對
如果一個套接字像一個電話插孔-允許通信的一些基礎(chǔ)設(shè)施,那么主機名和端口號就像區(qū)號和電話號碼的組合。有效的端口號范圍為0-65535(小于1024的端口號預(yù)留給了系統(tǒng))
3、面向連接的套接字和與無連接的套接字
面向連接,在進行通信之前必須建立一個連接。實現(xiàn)這種連接類型主要協(xié)議是TCP(傳輸控制協(xié)議)
無連接,在通信之前并不需要建立連接。主要協(xié)議是UDP(用戶數(shù)據(jù)報協(xié)議)
二、Python中的網(wǎng)絡(luò)編程
1、socket()模塊函數(shù)
為創(chuàng)建TCP/IP套接字:tcpSock = socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
創(chuàng)建UDP/IP套接字:udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2.常見的套接字對象方法和屬性
| 名稱 | 描述 |
| 服務(wù)器套接字方法 | |
| s.bind() | 將地址(主機名、端口號對)綁定到套接字上 |
| s.listen() | 設(shè)置并啟動TCP監(jiān)聽器 |
| s.accept() | 被動接受TCP客戶端連接,一直等待直到連接到達(阻塞) |
| 客戶端套接字方法 | |
| s.connect() | 主動發(fā)起TCP服務(wù)器連接 |
| s.connect_ex() | connect的擴展版本,此時會以錯誤代碼的形式返回問題,而不是拋出一個異常 |
| 普通的套接字方法 | |
| s.recv() | 接受TCP消息 |
| s.send() | 發(fā)送TCP消息 |
| s.sendall() | 完整的發(fā)送TCP消息 |
| s.recvfrom() | 接收UDP消息 |
| s.shutdown() | 關(guān)閉連接 |
| s.close() | 關(guān)閉套接字 |
3、創(chuàng)建TCP服務(wù)器
ss = socket() #創(chuàng)建服務(wù)器套接字
ss.bind() #套接字與地址綁定
ss.listen() #監(jiān)聽連接
inf_loop: #服務(wù)器無限循環(huán)
cs = ss.accept() #接收客戶端連接
comm_loop: #通信循環(huán)
cs.recv()/cs.send() #對話(接收、發(fā)送)
cs.close() #關(guān)閉客戶端套接字
ss.close() #關(guān)閉服務(wù)器套接字(可選)
#!/usr/bin/env python
#TCP時間戳服務(wù)器
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
print('waiting for connecting...')
tcpClisock, addr = tcpSerSock.accept()
print('...connected from:',addr)
while True:
data = tcpClisock.recv(BUFSIZ)
if not data:
break
tcpClisock.send('[%s] %s' % (bytes(ctime(),'utf-8'),data))
tcpClisock.close()
tcpSerSock.close()
4、創(chuàng)建TCP客戶端
cs = socket() cs.connect() comm_loop: cs.send()/cs.recv() cs.close()
#!/usr/bin/env python
#TCP時間戳客戶端
from socket import *
HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpClisock = socket(AF_INET,SOCK_STREAM)
tcpClisock.connect(ADDR)
while True:
data = input('> ')
if not data:
break
tcpClisock.send(data)
data = tcpClisock.recv(BUFSIZ)
if not data:
break
print(data.decode('utf-8'))
tcpClisock.close()
5、創(chuàng)建UDP服務(wù)器
ss = socket() ss.bind() inf_loop: cs = ss.recvfrom()/ss.sendto() ss.close()
#!/usr/bin/env python
#UDP時間戳服務(wù)器
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()
6、創(chuàng)建UDP客戶端
cs = socket() comm_loop: cs.send()/cs.recvfrom() cs.close()
#!/usr/bin/env python
#UDP時間戳客戶端
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
udpClisock = socket(AF_INET,SOCK_DGRAM)
while True:
data = input('> ')
if not data:
break
udpClisock.sendto(data,ADDR)
data, ADDR=udpClisock.recvfrom(BUFSIZ)
if not data:
break
print(data)
udpClisock.close()
以上就是本文關(guān)于Python網(wǎng)絡(luò)編程詳解的全部內(nèi)容,希望對大家有所幫助。歡迎參閱:Python中enumerate函數(shù)代碼解析、python數(shù)據(jù)類型判斷type與isinstance的區(qū)別實例解析、python中requests庫session對象的妙用詳解等,有什么問題可以隨時留言,有問題我就改。。。
相關(guān)文章
python獲取時間戳的實現(xiàn)示例(10位和13位)

