day29 struct模組解決黏包問題

2022-08-24 10:12:07 字數 2075 閱讀 8766

#

struct模組可以把乙個資料型別,例如數字int,轉化成固定長度(4個位元組)的bytes。int轉為4個bytes。

#在大量傳輸資料之前先告訴接收端即將接收資料的大小,方可解決黏包問題:

#利用struct模組打包要傳送的資料的長度,接收端接收這個包,解包之後,接收這個長度的資料。

import

struct

pack = struct.pack('

i',4096) #

打包,'i'代表int,把數字轉化成固定長度(4個位元組)的bytes。

print(pack) #

b'\x00\x10\x00\x00',4個位元組(bytes)

unpack = struct.unpack('

i',pack)#

解包print(unpack) #

(4096,) 解包的結果是乙個元祖

print(unpack[0]) #

4096,元祖的第乙個元素就是位元組數

#server:

import

socket

import

struct

sk =socket.socket()

sk.bind((

'127.0.0.1

',8888))

sk.listen()

conn,addr =sk.accept()

while

true:

cmd = input('

>>>')

if cmd == 'q'

: conn.send(b'q

')break

conn.send(cmd.encode(

'gbk

')) #

encode編碼,把str轉化為bytes。

pack = conn.recv(4) #

接收的是client的包,由4個位元組組成,這裡不需要decode解碼,因為下面是解包。

unpack = struct.unpack('i'

,pack)

ret = conn.recv(unpack[0]).decode('

gbk'

)

print

(ret)

conn.close()

sk.close()

#client:

import

socket

import

subprocess

import

struct

sk =socket.socket()

sk.connect((

'127.0.0.1

',8888))

while

true:

cmd = sk.recv(1024).decode('

gbk'

)

if cmd == 'q'

:

break

ret = subprocess.popen(cmd,shell=true,

stdout=subprocess.pipe,

stderr=subprocess.pipe)

std_out = ret.stdout.read() #

讀取出來的內容是 bytes

std_err = ret.stderr.read() #

讀取出來的內容是 bytes

len_num = len(std_out) + len(std_err) #

計算出兩個輸出的長度

pack = struct.pack('

i',len_num) #

打包長度,pack由4個位元組組成

sk.send(pack) #

server的pack = conn.recv(4)接收這個pack。

sk.send(std_out)

sk.send(std_err)

sk.close()

day29 學習總結

編譯時期異常 語法問題,需要開發人員顯示處理 執行時期異常 runtimeexception繼承自exception第一種 捕獲異常 trycatch 異常類名 物件名 finally 第二種 丟擲異常 throws throw 注意 開發中,多使用第一種方法1.位置不同 throws 位於方法宣告...

Java學習日記DAY29

多型 1.向上轉型 隱式轉型 自動轉型 父類引用指向子類例項,可以呼叫子類重寫父類的方法以及父類派生的方法,無法呼叫子類獨有方法 注意 父類中的靜態方法無法被子類重寫,所以向上轉型之後,只能呼叫到父類原有的靜態方法,想要呼叫子類中的靜態方法需要重新向下造型 小類轉型為大類 2.向下轉型 強制型別轉換...

day 29 模組和包

閱讀目錄 一。模組和指令碼 模組 定義 如果乙個py檔案被匯入了,他就是乙個模組 指令碼 定義 如果乙個py檔案被直接執行了,那他就是乙個指令碼 模組 1.沒有具體的呼叫過程 2.但是能對外提供功能 當乙個模組被匯入時,如果pyc檔案不存在,python直譯器就回去建立,存在不會再次被建立 pyc編...