import struct """通過 socket 的 send 和 recv 只能傳輸 str 格式的數據""" """struct.pack""" a1 = 10 a2 = 100 str = struct.pack("ii", a1, a2) print('str = ', str) """struct.unpack""" a1, a2 = struct.unpack("ii", str) print('a1 = ', a1) print('a2 = ', a2)
args = ("H", "ello world ", 5) struct.pack("c12si", *args) # 等價於 struct.pack("c12si", "H", "ello world ", 5)
一個完整的實例
- 1.f1.py
# -*- coding: utf-8 -*- """f1.py""" """Python socket 編程實例""" import socket import struct ######################################################################## class sckt: """變量名縮寫法,sckt 代表 socket""" #---------------------------------------------------------------------- def __init__(self, host = '192.168.1.3', port = 12345): """地址與端口初始化""" self.host = host self.port = port #---------------------------------------------------------------------- def run_server(self): """服務器""" sckt = socket.socket(socket.AF_INET, socket.SOCK_STREAM) """聲明 TCP/IP 報文""" sckt.bind((self.host, self.port)) """綁定地址與端口""" sckt.listen(5) """啟動監聽""" connection, address = sckt.accept() """開啟接收""" if connection.recv(1024) == b'Link': """對接信號,b'' 代表二進制形式的字符串,socket 的要求""" print('Linking server successed!') ld = [1, 2, 3] """Listdata,數據格式 3i = [int,int,int]""" sd = struct.pack('3i', ld[0], ld[1], ld[2]) """根據 ld 數據格式 pack 為 socket 傳輸格式 3i""" connection.send(sd) """向客戶端發送數據""" else: connection.send(b'Cut off the connection!') connection.close() """關閉鏈接""" #---------------------------------------------------------------------- def run_client(self, message = b'Link'): """客戶端""" sckt = socket.socket(socket.AF_INET, socket.SOCK_STREAM) """聲明 TCP/IP 報文""" sckt.connect((self.host, self.port)) """鏈接服務器""" sckt.send(message) """向服務器發送數據""" sd = sckt.recv(1024) """接收服務器數據""" ld = struct.unpack('3i', sd) """解包""" print(ld) sckt.close() """關閉連接"""
- 2.f2.py
# -*- coding: utf-8 -*- """f2.py""" """載入模塊""" import sys sys.path.append('D:/360data/重要數據/桌面') import f1 """地址初始化""" F1 = f1.sckt() """運行服務器""" F1.run_server() """運行客戶端""" F1.run_client()