- socket為介面通道,內部封裝了ip位址、埠、協議等資訊;我們可以看作是以前的通過**機撥號上網的年代,socket即為**線
我們通過下面的圖來了解socket的通訊流程
流程描述:
- 1 伺服器根據位址型別(ipv4,ipv6)、socket型別、協議建立socket
- 2 伺服器為socket繫結ip位址和埠號
- 3 伺服器socket監聽埠號請求,隨時準備接收客戶端發來的連線,這時候伺服器的socket並沒有被開啟
- 4 客戶端建立socket
- 5 客戶端開啟socket,根據伺服器ip位址和埠號試圖連線伺服器socket
- 6 伺服器socket接收到客戶端socket請求,被動開啟,開始接收客戶端請求,直到客戶端返回連線資訊。這時候socket進入阻塞狀態,
所謂阻塞即accept()方法一直等到客戶端返回連線資訊後才返回,開始接收下乙個客戶端連線請求
- 7 客戶端連線成功,向伺服器傳送連線狀態資訊
- 8 伺服器accept方法返回,連線成功
- 9 客戶端向socket寫入資訊(或服務端向socket寫入資訊)
- 10 伺服器讀取資訊(客戶端讀取資訊)
- 11 客戶端關閉
- 12 伺服器端關閉
- socket 方法中有兩個引數:family、type
family 的引數來確定伺服器之間的通訊
- family = af_inet : 伺服器之間的通訊
- family = af_inet6 :伺服器之間的通訊
- family = af_unix : unix系統中的程序間的通訊
type 的引數來確定連線協議
- type = sock_stream : 用來建立 tcp
- type = sock_dgram : 用來建立 udp
sk.bind(address)#s.bind(address) 將套接字繫結到位址。address位址的格式取決於位址族。在af_inet下,以元組(host,port)的形式表示位址。
sk.listen(backlog)
#開始監聽傳入連線。backlog指定在拒絕連線之前,可以掛起的最大連線數量。
#backlog等於5,表示核心已經接到了連線請求,但伺服器還沒有呼叫accept進行處理的連線個數最大為5
#這個值不能無限大,因為要在核心中維護連線佇列
sk.setblocking(bool)
#是否阻塞(預設true),如果設定false,那麼accept和recv時一旦無資料,則報錯。
sk.accept()
#接受連線並返回(conn,address),其中conn是新的套接字物件,可以用來接收和傳送資料。address是連線客戶端的位址。
#接收tcp 客戶的連線(阻塞式)等待連線的到來
sk.connect(address)
#連線到address處的套接字。一般,address的格式為元組(hostname,port),如果連線出錯,返回socket.error錯誤。
sk.connect_ex(address)
#同上,只不過會有返回值,連線成功時返回 0 ,連線失敗時候返回編碼,例如:10061
sk.close()
#關閉套接字
sk.recv(bufsize[,flag])
#接受套接字的資料。資料以字串形式返回,bufsize指定最多可以接收的數量。flag提供有關訊息的其他資訊,通常可以忽略。
sk.recvfrom(bufsize[.flag])
#與recv()類似,但返回值是(data,address)。其中data是包含接收資料的字串,address是傳送資料的套接字位址。
sk.send(string[,flag])
#注意send傳送的資料必須為byte
#將string中的資料傳送到連線的套接字。返回值是要傳送的位元組數量,該數量可能小於string的位元組大小。即:可能未將指定內容全部傳送。
sk.sendall(string[,flag])
#將string中的資料傳送到連線的套接字,但在返回之前會嘗試傳送所有資料。成功返回none,失敗則丟擲異常。
#內部通過遞迴呼叫send,將所有內容傳送出去。
sk.sendto(string[,flag],address)
#將資料傳送到套接字,address是形式為(ipaddr,port)的元組,指定遠端位址。返回值是傳送的位元組數。該函式主要用於udp協議。
sk.settimeout(timeout)
#設定套接字操作的超時期,timeout是乙個浮點數,單位是秒。值為none表示沒有超時期。一般,超時期應該在剛建立套接字時設定,因為它們可能用於連線的操作(如 client 連線最多等待5s )
sk.getpeername()
#返回連線套接字的遠端位址。返回值通常是元組(ipaddr,port)。
sk.getsockname()
#返回套接字自己的位址。通常是乙個元組(ipaddr,port)
sk.fileno()
#套接字的檔案描述符
------------------伺服器端------------------上述例子,我們實現了服務端與客戶端的連線,並進行了聊天;import socket
# 建立socket物件,socket 預設的引數為 family = af_inet 、type = sock_stream
sk = socket.socket()
address = ('127.0.0.1',8000)
# 繫結ip位址與埠
sk.bind(address)
# 最大的等待數為5
sk.listen(5)
print('server is waiting...')
# 進行阻塞,等待客戶端來連線
conn,addr = sk.accept()
# conn 為客戶端的socket物件
inp = input('>>>')
conn.send(bytes(inp,'utf-8'))
# conn.close()
# 關閉與客戶端的鏈結
-------------------------------------------
-------------------客戶端-------------------
import socket
sk = socket.socket()
address = ('127.0.0.1',8000)
sk.connect(address)
# 連線進入服務端
# recv也會進行阻塞,recv一次接收的內容最大為1024k
data = sk.recv(1024)
print(str(data,'utf-8'))
- 首先,我們需要先開啟服務端,此時服務端會進行阻塞,等待客戶端的接入
- 接著,我們就可以開啟客戶端連入服務端,此時即可以開始聊天
在往後,我們還會學到服務端的併發聊天、遠端操作、檔案上傳等相關操作
Python學習 Socket程式設計
應用程式兩端通過 套接字 向網路發出請求或者應答網路請求。可以把socket理解為通訊的把手 hand 是乙個介面,封裝了大量方法 socket起源於unix,在unix一切皆檔案哲學的思想下,socket是一種 開啟 讀 寫 關閉 模式的實現,伺服器和客戶端各自維護乙個 檔案 在建立連線開啟後,可...
Datawhale學習計畫 python基礎任務2
1.列表 a.標誌 pop方法 a.pop 刪除列表末尾 a.pop i 刪除某個位置 del del a 2 拷貝b a.copy c.列表相關方法 len list 列表元素個數 max list 返回列表元素最大值 min list 返回列表元素最小值 list seq 將元組轉換為列表 參考...
python基礎學習篇 python資料基本運算
移動到本行開頭 home鍵 移動到本行末尾 end鍵盤 注釋 ctrl 複製行 ctrl d 選擇列 滑鼠左鍵 alt 移動行 shift alt 上下箭頭 格式化 ctrl alt l 執行 shift ctrl f10 簡單來說它給人看的,通常是對 的描述資訊,不被執行。分為兩種 1.單行注釋 ...