Python socket編程之二:【struct.pack】&【struct.unpack】


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)

360截圖20160528203510104

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()

360截圖20160529004529435


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM