Python學習 socket基礎

2022-08-20 11:39:08 字數 3700 閱讀 4901

- 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.單行注釋 ...