1、服務器就是一系列硬件或軟件,為一個或多個客戶端(服務的用戶)提供所需的“服務”。它存在唯一目的就是等待客戶端的請求,并響應它們(提供服務),然后等待更多請求。
2、客戶端/服務器架構既可以應用于計算機硬件,也可以應用于計算機軟件。
3、在服務器響應客戶端之前,首先會創建一個通信節點,它能夠使服務器監聽請求。
一、套接字:通信端點
1、套接字
套接字是計算機網絡數據結構,它體現了上節中所描述的“通信端點”的概念。在任何類型的通信開始之前,網絡應用程序必須創建套接字。
有兩種類型的套接字:基于文件和面向網絡的。
2、套接字地址:主機-端口對
如果一個套接字像一個電話插孔-允許通信的一些基礎設施,那么主機名和端口號就像區號和電話號碼的組合。有效的端口號范圍為0-65535(小于1024的端口號預留給了系統)
3、面向連接的套接字和與無連接的套接字
面向連接,在進行通信之前必須建立一個連接。實現這種連接類型主要協議是TCP(傳輸控制協議)
無連接,在通信之前并不需要建立連接。主要協議是UDP(用戶數據報協議)
1、socket()模塊函數
為創建TCP/IP套接字:tcpSock = socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
創建UDP/IP套接字:udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2.常見的套接字對象方法和屬性
名稱 | 描述 |
服務器套接字方法 | |
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.shutdown() | 關閉連接 |
s.close() | 關閉套接字 |
3、創建TCP服務器
1
2
3
4
5
6
7
8
9
|
ss = socket() #創建服務器套接字 ss.bind() #套接字與地址綁定 ss.listen() #監聽連接 inf_loop: #服務器無限循環 cs = ss.accept() #接收客戶端連接 comm_loop: #通信循環 cs.recv() / cs.send() #對話(接收、發送) cs.close() #關閉客戶端套接字 ss.close() #關閉服務器套接字(可選) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#!/usr/bin/env python #TCP時間戳服務器 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、創建TCP客戶端
1
2
3
4
5
|
cs = socket() cs.connect() comm_loop: cs.send() / cs.recv() cs.close() |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#!/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、創建UDP服務器
1
2
3
4
5
|
ss = socket() ss.bind() inf_loop: cs = ss.recvfrom() / ss.sendto() ss.close() |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#!/usr/bin/env python #UDP時間戳服務器 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、創建UDP客戶端
1
2
3
4
|
cs = socket() comm_loop: cs.send() / cs.recvfrom() cs.close() |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/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() |
以上就是本文關于Python網絡編程詳解的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,有問題我就改。。。
原文鏈接:http://www.cnblogs.com/caicairui/p/7749678.html