一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python網(wǎng)絡編程調(diào)用recv函數(shù)完整接收數(shù)據(jù)的三種方法

python網(wǎng)絡編程調(diào)用recv函數(shù)完整接收數(shù)據(jù)的三種方法

2020-09-27 13:25南宮軒諾 Python

本文主要介紹了python網(wǎng)絡編程調(diào)用recv函數(shù)完整接收數(shù)據(jù)的三種方法。具有很好的參考價值,下面跟著小編一起來看下吧

最近在使用python進行網(wǎng)絡編程開發(fā)一個通用的tcpclient測試小工具。在使用socket進行網(wǎng)絡編程中,如何判定對端發(fā)送一條報文是否接收完成,是進行socket網(wǎng)絡開發(fā)必須要考慮的一個問題。這里,簡要介紹一下判別數(shù)據(jù)接收接收完成常用的三種方法:

1.基礎數(shù)據(jù)接收法:

使用基礎數(shù)據(jù)接收法時,當與服務socket斷開連接時,會接收到空字符串。因此,可以根據(jù)此特點,在程序中加入循環(huán),一直接收數(shù)據(jù),直到數(shù)據(jù)發(fā)送端關閉socket連接。適用場景:客戶端和服務器的鏈接為短鏈接(即一次socket通訊后連接就會關閉)。代碼如下:

?
1
2
3
4
5
6
7
8
9
10
import socket,struct,sys,time
Port=22220
#assume a socket disconnect (data returned is empty string) means all data was #done being sent.
def recv_basic(the_socket):
 total_data=[]
 while True:
  data = the_socket.recv(20480)
  if not data: break
  total_data.append(data)
 return ''.join(total_data)

2.尾標識方法

通過尋找接收的協(xié)議數(shù)據(jù)中的尾標識字符串,獲取完整的數(shù)據(jù)的數(shù)據(jù)報文。適用場景:接收的協(xié)議數(shù)據(jù)中包含相關的尾標識。代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
End='something useable as an end marker'
def recv_end(the_socket):
 total_data=[];data=''
 while True:
   data=the_socket.recv(8192)
   if End in data:
    total_data.append(data[:data.find(End)])
    break
   total_data.append(data)
   if len(total_data)>1:
    #check if end_of_data was split
    last_pair=total_data[-2]+total_data[-1]
    if End in last_pair:
     total_data[-2]=last_pair[:last_pair.find(End)]
     total_data.pop()
     break
 return ''.join(total_data)

3.負載長度方法

即通過協(xié)議數(shù)據(jù)中的負載長度值,確定有效報文的長度,適用場景:協(xié)議數(shù)據(jù)中包含負載協(xié)議字段。這種方法也是比較常用和通用的一種方法,但是需要一邊接收數(shù)據(jù)一邊解析數(shù)據(jù)。代碼如下: 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def recv_size(the_socket):
 #data length is packed into 4 bytes
 total_len=0;total_data=[];size=sys.maxint
 size_data=sock_data='';recv_size=8192
 while total_len<size:
  sock_data=the_socket.recv(recv_size)
  if not total_data:
   if len(sock_data)>4:
    size_data+=sock_data
    size=struct.unpack('>i', size_data[:4])[0]
    recv_size=size
    if recv_size>524288:recv_size=524288
    total_data.append(size_data[4:])
   else:
    size_data+=sock_data
  else:
   total_data.append(sock_data)
  total_len=sum([len(i) for i in total_data ])
 return ''.join(total_data)

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!

原文鏈接:http://www.cnblogs.com/litaozijin/p/6624029.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品热久久毛片 | 免费国产好深啊好涨好硬视频 | 亚洲第一成年免费网站 | 久久噜国产精品拍拍拍拍 | 韩国靠逼 | 艾秋麻豆果冻传媒老狼仙踪林 | 国产精品久久现线拍久青草 | 亚洲玖玖 | 日本高清在线看免费观看 | 热门小说同人h改编h | 日本国产成人精品视频 | 成年女人毛片免费观看中文w | 2020中文字幕 | s8sp加密路线和免费路线首页 | 龟甲情感超市全文阅读 小说 | 校花被扒开尿口折磨憋尿 | 欧美大奶艳星 | 超高清欧美同性videos | 欧美极品摘花过程 | 国产精品免费aⅴ片在线观看 | 洗濯屋H纯肉动漫在线观看 武侠艳妇屈辱的张开双腿 午夜在线观看免费观看 视频 | 婷婷日韩| 苍井空50分钟无码 | 王淑兰李思雨李铁柱乡村小说免费 | 含羞草传媒一天免费看下 | 国产日本久久久久久久久婷婷 | 99国产牛牛视频在线网站 | 国产精品suv | 4455在线 | 国产成人精品男人的天堂538 | 国语精彩对白2021 | 91免费播放人人爽人人快乐 | 九九99热久久999精品 | 91精品国产91久久久久久麻豆 | 欧美一区二区三区免费观看视频 | 好姑娘在线完整版视频 | 国内剧情麻豆 | 欧美亚洲视频在线观看 | 成年视频在线播放 | 精品国产一区二区三区久久久狼 | 天天夜夜啦啦啦 |