需要做測試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長度:
# -*- 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'
這個沒有時間去了解為什麼。後面就寫了一下簡單的傳送實現**:
# -*- 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結尾
字串的時候
單位元組雙位元組
四位元組由於python的數字轉換後是低位在前,所在需要反序
'''class packargument():
length = 0
content = "";
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()
buff = initpack(1, packargument.content)
data = sockobj.send(buff)
print 'client received:', repr(data)
time.sleep(3);
sockobj.close();
服務端輸出:
user admin sign in.
user:admin disconnect!
socket檔案傳送
include include pragma comment lib,ws2 32.lib define ipaddr 172.26.145.2 define port 3574 class socket socket bool windowinit else sock stream 提供有序的 可...
Python利用socket傳送與接收檔案001
應用場景 語言python,利用socket進行檔案傳輸 針對windows本地檔案d盤主目錄下的6個子目錄對應6中檔案,如 d 主目錄 001 2021 01 01 每個子目錄每天會產生乙個新的次子目錄並附帶一些內部檔案以當天日期命名如 d 主目錄 002 2021 01 01 xx,001則產生...
socket中的傳送與接收函式
網路i o操作 一 read write 二 recv send 三 readv writev 四 recvmsg sendmsg 五 recvfrom sendto 1 推薦使用recvmsg sendmsg 函式,這兩個函式是最通用的i o函式,實際上可以把上面的其它函式都替換成這兩個函式。2 ...