#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'
)
(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編...