一、Socket 套接字簡介
1、Socket 套接字概念
Socket 套接字 是一種 進程之間的 通信機制 , 通過套接字可以在 不同的進程之間 進行數(shù)據(jù)交換 ;
在 網(wǎng)絡(luò)編程 中 , Socket 套接字 主要用于 客戶端 與 服務(wù)器 之間的 通信 , 大部分 網(wǎng)絡(luò)相關(guān)的應(yīng)用程序 , 都使用到了 Socket 套接字技術(shù) ;
2、Socket 套接字類型
套接字有兩種類型 :
-
流套接字 : 提供了一個可靠的、面向連接的通信機制 , 可以 順序地傳輸數(shù)據(jù)。
- 在 TCP/IP 協(xié)議中,流套接字使用 TCP 協(xié)議進行數(shù)據(jù)傳輸。
-
數(shù)據(jù)報套接字 : 提供了一種無連接、不可靠的通信機制 , 數(shù)據(jù) 以獨立的數(shù)據(jù)包形式傳輸。
- 在 TCP/IP 協(xié)議中,數(shù)據(jù)報套接字使用 UDP 協(xié)議進行數(shù)據(jù)傳輸。
3、Socket 套接字使用步驟
Socket 套接字使用步驟 :
- 創(chuàng)建套接字 : 使用 套接字 API 創(chuàng)建一個套接字對象 , 一般由 編程語言 官方提供 標(biāo)準(zhǔn) API ;
- 綁定 IP 地址和端口號 : 將套接字與一個 IP 地址 和 端口號綁定 ;
-
建立連接 :
- 服務(wù)器端監(jiān)聽連接 : 對于流套接字,需要在服務(wù)器端監(jiān)聽客戶端的連接請求 ;
- 客戶端建立連接 : 對于流套接字,客戶端需要與服務(wù)器建立連接 ;
- 發(fā)送和接收數(shù)據(jù) : 使用 Socket 套接字 發(fā)送 或 接收 數(shù)據(jù) ;
- 關(guān)閉連接 : 數(shù)據(jù)傳輸完畢后,關(guān)閉 Socket 套接字連接 ;
4、Socket 套接字服務(wù)端與客戶端
Socket 套接字 進行 數(shù)據(jù)通信時 , 需要有兩個 Socket 套接字分別作為 客戶端 和 服務(wù)器端 :
- Socket 套接字 服務(wù)器端 : 需要 監(jiān)聽客戶端的請求 , 可以 向 客戶端 發(fā)送消息 , 可以接收來自客戶端的消息 ;
- Socket 套接字 客戶端 : 需要主動連接 服務(wù)器端 , 可以 向 服務(wù)器端 發(fā)送消息 , 可以接收來自服務(wù)器端的消息 ;
一個 服務(wù)器端 可以 同時與 多個 客戶端 進行 數(shù)據(jù)交互 ;
二、Socket 服務(wù)端與客戶端開發(fā)
1、服務(wù)端
Socket 服務(wù)器端流程 :
- 創(chuàng)建套接字 : 使用 套接字 API 創(chuàng)建一個套接字對象 , 一般由 編程語言 官方提供 標(biāo)準(zhǔn) API ;
# 1. 創(chuàng)建 socket 實例對象
import time
- 綁定 IP 地址和端口號 : 將套接字與一個 IP 地址 和 端口號綁定 ;
# 2. 為 socket 實例對象 綁定 IP 地址和端口號
# IP 地址是字符串類型, 端口號是 int 類型, 將這兩個數(shù)據(jù)定義到元組中
socket_server.bind(("127.0.0.1", 8090))
- 服務(wù)器端監(jiān)聽連接 : 對于流套接字,需要在服務(wù)器端監(jiān)聽客戶端的連接請求 ;
# 4. 阻塞等待連接 , 如果沒有客戶端連接 , 會一直阻塞在這里
# accept 函數(shù)返回的是 二元元組 , 使用兩個變量接收該元組
# conn 是連接的 socket 對象
# address 是連接的 地址
client_socket, client_address = socket_server.accept()
- 發(fā)送和接收數(shù)據(jù) : 使用 Socket 套接字 發(fā)送 或 接收 數(shù)據(jù) ;
# 向客戶端發(fā)送連接成功提示
client_socket.send("你好, 客戶端!".encode("UTF-8"))
- 關(guān)閉連接 : 數(shù)據(jù)傳輸完畢后,關(guān)閉 Socket 套接字連接 ;
# 關(guān)閉連接
client_socket.close()
代碼示例 :
"""
Socket 服務(wù)器 代碼示例
"""
# 導(dǎo)入 socket 模塊
import socket
# 1. 創(chuàng)建 socket 實例對象
import time
socket_server = socket.socket()
# 2. 為 socket 實例對象 綁定 IP 地址和端口號
# IP 地址是字符串類型, 端口號是 int 類型, 將這兩個數(shù)據(jù)定義到元組中
socket_server.bind(("127.0.0.1", 8090))
# 3. 服務(wù)器端監(jiān)聽端口
# 傳入的參數(shù)是一個整數(shù) , 該參數(shù)表示允許連接的數(shù)量
# 如果連接已滿后面的連接請求會等待
socket_server.listen(100)
while True:
# 4. 阻塞等待連接 , 如果沒有客戶端連接 , 會一直阻塞在這里
# accept 函數(shù)返回的是 二元元組 , 使用兩個變量接收該元組
# conn 是連接的 socket 對象
# address 是連接的 地址
client_socket, client_address = socket_server.accept()
# 向客戶端發(fā)送連接成功提示
client_socket.send("你好, 客戶端!".encode("UTF-8"))
print(f'客戶端連接成功 {client_address}')
# 5. 服務(wù)器端與客戶端進行交互
while True:
# 循環(huán)接收客戶端數(shù)據(jù), 并使用 UTF-8 解碼
data = client_socket.recv(1024).decode("UTF-8")
# 向客戶端會送消息
client_socket.send(f"服務(wù)端已收到: {data}".encode())
print(f"客戶端: {data}")
if data == 'quit':
break
# 關(guān)閉連接
client_socket.close()
print(f'客戶端連接關(guān)閉 {client_address}')
2、客戶端
Socket 客戶端流程 :
- 創(chuàng)建套接字 : 使用 套接字 API 創(chuàng)建一個套接字對象 , 一般由 編程語言 官方提供 標(biāo)準(zhǔn) API ;
# 1. 創(chuàng)建 socket 實例對象
client_socket = socket.socket()
- 通過 IP 地址和端口號 連接服務(wù)器 :
# 2. 客戶端連接服務(wù)器, IP 地址和端口號放在元組中
client_socket.connect(('127.0.0.1', 8090))
- 發(fā)送和接收數(shù)據(jù) : 使用 Socket 套接字 發(fā)送 或 接收 數(shù)據(jù) ;
# 發(fā)送數(shù)據(jù)到服務(wù)器
client_socket.send('你好, 服務(wù)器!'.encode())
- 關(guān)閉連接 : 數(shù)據(jù)傳輸完畢后,關(guān)閉 Socket 套接字連接 ;
# 4. 關(guān)閉連接
client_socket.close()
代碼示例 :
import socket
# 創(chuàng)建TCP socket對象
import time
# 1. 創(chuàng)建 socket 實例對象
client_socket = socket.socket()
# 2. 客戶端連接服務(wù)器, IP 地址和端口號放在元組中
client_socket.connect(('127.0.0.1', 8090))
# 3. 向服務(wù)器端發(fā)送消息和接收消息
# 發(fā)送數(shù)據(jù)到服務(wù)器
client_socket.send('你好, 服務(wù)器!'.encode())
print("客戶端發(fā)送: 你好, 服務(wù)器!")
time.sleep(1)
# 接收服務(wù)器數(shù)據(jù)
data = client_socket.recv(1024).decode("UTF-8")
print(f"服務(wù)端: {data}")
# 獲取命令行輸入發(fā)送給客戶端
while True:
command = input("請輸入: ")
client_socket.send(command.encode())
print(f"客戶端發(fā)送: {command}")
if command == 'quit':
break
# 接收服務(wù)器數(shù)據(jù)
data = client_socket.recv(1024).decode("UTF-8")
print(f"服務(wù)端: {data}")
# 4. 關(guān)閉連接
client_socket.close()
print("客戶端關(guān)閉")
3、執(zhí)行結(jié)果
先啟動服務(wù)器端 :
啟動客戶端 :
此時服務(wù)器端信息如下 :
客戶端中斷輸入 1 :
服務(wù)器端效果 :
客戶端繼續(xù)輸入信息 :
服務(wù)器端信息如下 :
客戶端輸入 quit 關(guān)閉連接 :
服務(wù)器端對應(yīng)的數(shù)據(jù) :文章來源:http://www.zghlxwxcb.cn/news/detail-617421.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-617421.html
到了這里,關(guān)于【Python】Python 網(wǎng)絡(luò)編程 ( Socket 套接字簡介 | Socket 套接字使用步驟 | Socket 套接字服務(wù)端與客戶端開發(fā) )的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!