python socket函式詳解
阿新 • • 發佈:2020-07-26
關於socket函式,每個的意義和基本功能都知道,但每次使用都會去百度,引數到底是什麼,返回值代表什麼意義,就是說用的少,也記得不夠精確。每次都查半天,經常煩惱於此。索性都弄得清楚、通透,並記錄下來,一來便於自己記憶,再者以防日後查閱、回顧。
主要介紹:socket、bind、listen、connect、accept、send、sendto、recv、recvfrom、close、shutdown。
## 1.socket型別
####套接字格式
socket(family,type[,protocal])使用給定的地址族,套接字型別,協議編號(預設為0)來建立套接字
其中:
family指明瞭協議族/域,通常AF_INET、AF_INET6、AF_LOCAL等;
type是套介面型別,主要是SOCK_STREAM、SOCK_DGRAM、SOCK_RAW;
protocol一般取為0。(預設)與特定的地址家族相關的協議,如果是 0 ,則系統就會根據地址格式和套接類別,自動選擇一個合適的協議成功時,返回一個小的非負整數值,與檔案描述符類似。
#### 建立TCP Socket:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#### 建立UDP Socket:
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
## 2.socket函式
注意:
+ TCP傳送資料時,已經建立好TCP連線,所以不需要指定的地址,而UDP是面向無連線的,每次傳送要指定傳送給誰。
+ 服務端與客戶端不能直接傳送列表,元組,字典。需要進行字串化。
host == ip
####服務端socket函式
| 函式|描述 |
|:----|:----|
| s.bind(address) | 將套接字繫結到地址,在AF_INET下,以tuple(host,prot)的方式傳入,如s.bind((host,port))。 |
| s.listen(backlog) | 開始監聽TCP傳入連線。backlog指定在拒絕連線之前,作業系統可以掛起的最大連線數量。該值最少為1,大部分應用程式社為5就可以了。 |
| s.accept() | 接受TCP連線並返回(conn,address),其中conn是新的套接字物件,可以用來接收和傳送資料,address是連線客戶端的地址。(sock,addr = s.accept)。 |
#### 客戶端socket函式
| 函式|描述 |
|:----|:----|
|s.connect(address)|連結到address處的套接字,一般address的格式為tuple(host,port),如果連結出錯,則返回socket.error錯誤。|
|s.connect_ex(address)|功能與s.connect(address)相同,但成功返回0,失敗返回errno的值。|
#### 公共Socket函式
| 函式|描述 |
|:----|:----|
|s.recv(bufsize[,flag])|接受TCP套接字的資料,資料以字串的形式返回,bufsize指定要接收的最大資料量,flag提供有關訊息的其它訊息,通常可以忽略。|
|s.recvfrom(bufsize[,flag])|接受UDP套接字的資料,與recv()類似,但返回值是tuple(data,address)。其中data是包涵接受資料的字串,address是傳送資料的套接字地址。|
|s.send(string[,flag])|傳送TCP資料,將string中的資料傳送到連線到套接字,返回值是要傳送到位元組數量,該數量可能小於string的位元組大小。|
|s.sendall(string[,flag])|完整發送TCP資料,將string中的資料傳送到連結到套接字,但在返回之前嘗試傳送所有的資料。成功返回None,失敗則丟擲異常。|
|s.sendto(string[,flag],address)|傳送UDP資料,將資料傳送到套接字,address形式為tuple(hostadder,port),指定遠端地址傳送,返回值是傳送到位元組。|
|s.close()|關閉套接字。|
|s.getpeername()|返回套接字的遠端地址,返回值通常是一個tuple(hostaddr,port)。|
|s.getsockname()|返回套接字自己的地址,返回值通常是一個tuple(hostaddr,port)。|
|s.getsockopt(level,optname[,buflen]])|返回套接字選項的值。|
|s.gettimeout()|返回當前超時值,單位是秒,如果沒有設定超時值則返回None。|
|s.setsockopt(level, option,value)|設定給定套接字選項的值|
|s.settimeout(timeout)|設定套接字操作的超時時間,timeout是一個浮點數,單位是秒。值為None則表示永遠不會超時。一般超時期應在剛建立套接字時設定,因為它們可能用於連線的操作,如s.connect()。|
|s.setblocking(flag)|如果flag為0,則將套接字設定為非阻塞模式,否則將套接字設定為阻塞模式(預設值)。非阻塞模式下,如果呼叫recv()沒有發現任何資料,或send()呼叫無法立即傳送資料,那麼將引發socket.error異常。|
|s.makefile()|建立一個與該套接字相關的檔案。|
|s.fileno()|返回套接字的檔案描述。|
## 3.socket程式設計思路
#### TCP服務端:
1建立套接字,繫結套接字到本地IP與埠
```python
socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(("0.0.0.0",80000))
```
2開始監聽連線
```python
s.listen()
```
3進入迴圈,不斷接受客戶端的連線請求
```python
s.accept()
```
4然後接受傳來的資料,併發送給對方資料
```python
s.recv() #接收資料
s.sendall()#傳送資料
```
5傳輸完畢後,關閉套接字
```python
s.close()
```
#### TCP客戶端
1建立套接字,連線遠端地址
```python
socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("127.0.0.1",8000))
```
2連線後傳送資料和接受資料
```python
s.sendall()
s.recv()
```
3傳輸完畢後,關閉套接字
```python
s.close()
```
![](https://img2020.cnblogs.com/blog/1878490/202007/1878490-20200726203948723-523931620.jpg)