python中socket傳送也研究了半天
阿新 • • 發佈:2019-01-27
需要做測試tcp通訊工具,socket本來就沒什麼,就是它要傳送內容如何打包的問題。從最原先的struct.pack到bytearray,再到bitarray,後來又回到了struct.pack,其實這就足夠我使用了。
測試中,需要傳送的內容是 byte+int+byte+string+0,意思分別是 版本號,資料長度,介面標識,本介面的內容(這個介面只接受單個字串,字串後面需要0結束)。
python中我算是非常新手,研究中發現,其實str型別加上struct.pack就可以完成我的需求,但其中pack有一個奇怪的問題,pack中的fmt引數,同樣的b,後面跟i會拿到b增加到4byte長度:
輸出: '\x01'
'\x01\x00\x00\x00\x01\x00\x00\x00'
'\x011' 這個沒有時間去了解為什麼。後面就寫了一下簡單的傳送實現程式碼:
User:admin disconnect!
# -*- coding:utf-8 -*-
import struct
data = struct.pack("b", 1)
print repr(data)
data = struct.pack("bi", 1, 1) # 這裡的b居然佔了4個byte
print repr(data)
data = struct.pack("bs", 1, "1")
print repr(data)
輸出: '\x01'
'\x01\x00\x00\x00\x01\x00\x00\x00'
'\x011' 這個沒有時間去了解為什麼。後面就寫了一下簡單的傳送實現程式碼:
服務端輸出: User admin sign in.# -*- coding:utf-8 -*- import time import struct from socket import * serverHost = 'localhost' serverPort = 2950 sockobj = socket(AF_INET, SOCK_STREAM) sockobj.connect((serverHost, serverPort)) userName = "admin" userName = bytes(userName) ''' 合併後面的引數,引數只有四種 單位元組 雙位元組 四位元組 字串,需帶0結尾 呼叫append追加, 字串的時候 pack.append('我是字串') 單位元組 pack.append(10, 1) 雙位元組 pack.append(10, 2) 四位元組 pack.append(10, 4) 由於python的數字轉換後是低位在前,所在需要反序 ''' class PackArgument(): length = 0 content = ""; def append(self, cont, num=0): if (num == 0): self.content += bytes(cont) + '\x00'; else: fmt = 'b' if (num == 2): fmt = 'h' elif num == 4: fmt = 'i' cont = struct.pack(fmt, cont); cont = cont[::-1]; self.content += cont; ''' 合併報文頭 版本號 長度 呼叫功能 ''' def initPack(serverHandler, content): contLen = len(content) + 6 packed = struct.pack("i", contLen) packed = '\x01' + packed[::-1] + struct.pack('b', serverHandler) + content return packed packArgument = PackArgument() packArgument.append("admin") buff = initPack(1, packArgument.content) data = sockobj.send(buff) print 'client received:', repr(data) time.sleep(3); sockobj.close();
User:admin disconnect!