學習筆記(13):Python網絡編程并發編程-解決粘包問題-終極版本

立即學習:https://edu.csdn.net/course/play/24458/296244?utm_source=blogtoedu

粘包現象解決(終極版)

?

1.簡單版的問題所在

?

1)報頭信息不一定只是包含著命令執行結果的字節數長度,在文件傳輸的時候也可能包含文件名等,這時候就需要用到字典來將文件的相關信息進行封裝

?

2)struct模塊中struct.pack('l',數據長度),這個數據長度是有限制的,當發送的文件的字節數長度超過時,就會出現錯誤!

?

?

2.知識點

?

1)字典轉為bytes類型:首先使用json.dumps(dict)將字典序列化為json字符串,然后使用.encode('utf-8')對json字符串進行編碼成bytes類型

?

2)bytes類型解析為字典:首先對bytes進行解碼成json字符串,然后將json字符串反序列為字典即可(json.loads(json字符串))

?

3.關鍵代碼

'''
服務端
'''......#2處理命令,執行命令并且獲得命令得到的結果obj = subprocess.Popen(cmd.decode('utf-8'),shell=True,stdout=subprocess.PIPE,#將正確運行命令得到的結果傳給管道stdout中stderr=subprocess.PIPE)#將沒有正確運行命令得到的返回信息存放在stderr管道中stdout = obj.stdout.read()stderr = obj.stderr.read()total_size = len(stderr + stdout)#1)制作包含文件名和文件大小的文件頭,用字典實現headers_dict = {"filename":"nianbao","filedata":"2020/03/09","total_size":total_size}#2)將字典先序列化成驚悚字符串,再轉為bytes類型文件頭headers_json = json.dumps(headers_dict)#3)獲取bytes類型的長度headers_bytes = headers_json.encode('utf-8')headers_size = len(headers_bytes)#4)將bytes類型文件頭長度定制為固定長度的報頭header = struct.pack('i',headers_size)#5)向客戶端發送報頭conn.send(header)#6)向客戶端發送包含文件信息的字典conn.send(headers_bytes)#7)向客戶端發送真實命令執行的結果data = stdout + stderrconn.send(data)......
'''
客戶端
'''......#4、接收服務器返回來的數據recv()#1)先接收由服務器返回來的報頭,報頭是固定長度的,因此取前面4字節的數據即為報頭header = phone.recv(4)#返回的是一個對象#2)解析報頭,得到bytes類型的文件頭長度obj_truple = struct.unpack('i',header)#返回的是一個元組headers_bytes_size = obj_truple[0]#取元組第一個元素即為總字節數#3)接收bytes類型的文件頭數據headers_bytes = phone.recv(headers_bytes_size)#4)將bytes類型的文件頭數據反序列化成字典headers_json = headers_bytes.decode('utf-8')headers_dict = json.loads(headers_json)#5)從字典中取出字命令執行結果字節總長度total_size = headers_dict['total_size']#6)接收返回的數據recv_size = 0data = b''while recv_size < total_size:recv_data = phone.recv(1024)#接收小于1024bytes的數據recv_size += len(recv_data)data += recv_data#7)打印字典并且打印返回的數據print(headers_dict)print('服務器返回來的數據:',data.decode('gbk'))print('*'*50)......

4.完整代碼:在上一篇筆記的基礎上修改一下即可

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257076.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257076.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257076.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#多態

C#多態 多態性&#xff08;C# 編程指南&#xff09;轉自MSDN通過繼承&#xff0c;一個類可以用作多種類型&#xff1a;可以用作它自己的類型、任何基類型&#xff0c;或者在實現接口時用作任何接口類型。這稱為多態性。C# 中的每種類型都是多態的。類型可用作它們自己的類型或用…

Ubuntu 14.04.02 安裝openvswitch-2.3.1

Open vSwitch安裝 安裝好操作系統 # lsb_release -a LSB Version: core-2.0-amd64:core-2.0-noarch:core-3.0-amd64:core-3.0-noarch:core-3.1-amd64:core-3.1-noarch:core-3.2-amd64:core-3.2-noarch:core-4.0-amd64:core-4.0-noarch:core-4.1-amd64:core-4.1-noarch:security…

struts-上傳

一、創建項目項目名稱&#xff1a;demoupload二、添加jar包commons-fileupload-1.2.2.jarcommons-io-2.0.1.jarcommons-lang3-3.1.jarfreemarker-2.3.19.jarjavassist-3.11.0.GA.jarognl-3.0.5.jarstruts2-core-2.3.4.1.jarxwork-core-2.3.4.1.jar三、在web.xml文件中配置過濾器…

將數組作為參數,調用該函數時候給的是數組地址還是整個數組

1、在實際的應用中&#xff0c;數組經常作為函數參數&#xff0c;將數組中的數據傳遞到另外一個函數中&#xff0c;一般來說&#xff0c;傳遞可以采用兩種方法&#xff1a; 1>、數組元素作為函數的實參時&#xff0c;用法跟普通變量作參數相同&#xff0c;將數組元素的值傳遞…

C#項目中常用到的設計模式

C#項目中常用到的設計模式 1. 引言 一個項目的通常都是從Demo開始&#xff0c;不斷為項目添加新的功能以及重構&#xff0c;也許剛開始的時候代碼顯得非常凌亂&#xff0c;毫無設計可言。但是隨著項目的迭代&#xff0c;往往需要將很多相同功能的代碼抽取出來&#xff0c;這也是…

學習筆記(14):Python網絡編程并發編程-文件傳輸功能實現

立即學習:https://edu.csdn.net/course/play/24458/296245?utm_sourceblogtoedu 1.課程目的&#xff1a; 實現客戶端輸入下載文件的命令&#xff0c;然后將命令發送給服務端&#xff0c;服務端再執行下載文件的命令&#xff0c;最后將執行下載文件命令后的結果返回給客戶端&a…

NFS精簡版配置方法

此實驗的前提是防火墻需關閉。 1.關閉iptables /etc/init.d/iptables stop /etc/init.d/iptables status 2.關閉selinux setenforce 0 getenforce Permissive ---出現這個單詞即代表selinux臨時關閉&#xff0c;如需永久關閉則需修改/etc/sysconfig/selinux配置文件 …

Serializable接口中serialVersionUID字段的作用

序列化運行時使用一個稱為 serialVersionUID 的版本號與每個可序列化類相關聯&#xff0c;該序列號在反序列化過程中用于驗證序列化對象的發送者和接收者是否為該對象加載了與序列化兼容的類。 如果接收者加載的該對象的類的 serialVersionUID 與對應的發送者的類的版本號不同&…

重新認知指針

1、把指針指向的變量的數據類型稱為指針的數據類型&#xff1b;而任何一個指針變量本身數據值的類型都是unsigned long int 2.、指針變量名前的符號“*”表示的是指向運算。 3、不要認為“ *p" 是指針變量&#xff0c;指針變量是p而不是*p 4、

分布式數據庫 HBase

原文地址&#xff1a;http://www.oschina.net/p/hbase/ HBase 概念 HBase – Hadoop Database&#xff0c;是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統&#xff0c;利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集群。 HBase是Google Bigtable的開源實…

學習筆記(15):Python網絡編程并發編程-進程理論

立即學習:https://edu.csdn.net/course/play/24458/296423?utm_sourceblogtoedu 1.進程&#xff1a;正在運行的一個過程或者一個任務&#xff1b; 2.進程與程序的區別&#xff1a;程序是一堆代碼&#xff0c;程序運行起來就是進程了&#xff0c;一個程序運行兩次&#xff0c;算…

【翻譯】Designing Websites for iPhone X

讓網站適配 iphone X 英文原文地址&#xff1a;https://webkit.org/blog/7929/...本文原文地址&#xff1a;https://github.com/cnsnake11/... The section below about safe area insets was updated on Oct 31, 2017 to reflect changes in the iOS 11.2 beta. 以下關于safe …

指針作為函數參數引用數組的任意元素

void swap(int *a,int*b) {*a*a^*b;*b*a^*b;*a*a^*b; } swap(data[j],data[j1]&#xff09;; int data[10]{13,55,48,13,62,45,754,0,10};以上是我遇到的問題&#xff0c;我覺得調用這個swap函數是不能這樣直接把數組的某個元素直接丟給swap數據 在程序中參加數據處理的量不是指…

使用 Log4Net 記錄日志

第一步&#xff1a;下載Log4Net 下載地址&#xff1a;http://logging.apache.org/log4net/download_log4net.cgi 把下載的 log4net-1.2.11-bin-newkey解壓后&#xff0c;如下圖所示&#xff1a; 雙擊bin文件夾 雙擊net文件夾&#xff0c;選擇針對.NET FramerWork的不同版本 找…

Xcode常用快捷鍵

1. 文件CMD N: 新文件CMD SHIFT N: 新項目CMD O: 打開CMD S: 保存CMDOPtS&#xff1a;保存所有文件CMD SHIFT S: 另存為CMD W: 關閉窗口CMD Q :退出XcodeCMD SHIFT W: 關閉文件2. 編輯CMD [: 左縮進CMD ]: 右縮進CMDshiftF:項目中查找CMDG:查找下一個CMDshiftG:查…

學習筆記(16):Python網絡編程并發編程-開啟子進程的兩種方式

立即學習:https://edu.csdn.net/course/play/24458/296424?utm_sourceblogtoedu #方式一&#xff1a;使用python內置模塊multiprocessing下的process類 from multiprocessing import Process import time#定義進程函數 def task(name):print(%s is running&#xff01;%name)t…

ElasticSearch的API python調用

os json datetime datetime django.http HttpResponse reelasticsearch Elasticsearches Elasticsearch([])res8 es.search({:{:{:{::}}}} ) statistic():():hit res8[][]:a (%hit %hit[])a re.split(a);arow a:id row[] row[]idHttpResponse(a)轉載于:https://blog.51cto…

HDU 1757 A Simple Math Problem (矩陣快速冪)

題目鏈接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1757 在吳神的幫助下才明白如何構造矩陣&#xff0c;還是好弱啊。 此處盜一張圖 1 #include <iostream>2 #include <cstdio>3 #include <cstring>4 #include <cmath>5 #include <al…

Spring學習使用標簽來標記資源(@Component、@Repository、 @Service和@Controller)和用法(包括如何jsp正在使用)...

首先&#xff0c;在xml其中新增部分標有下劃線的文件&#xff0c;容器初始化的時候需要掃描包 注意&#xff1a; a. 包款掃描(下劃線部分)一定要加&#xff0c;默認是不掃描整個包。與每一包之間’&#xff0c;’開。如過具有同樣的父包&#xff0c;那么我們能夠用父包來取…