最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Python解析Socket数据流异常bytes的问题(详细)

来源:动视网 责编:小采 时间:2020-11-27 14:20:27
文档

Python解析Socket数据流异常bytes的问题(详细)

Python解析Socket数据流异常bytes的问题(详细):本篇文章给大家带来的内容是关于Python解析Socket数据流异常bytes的问题(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。python在通过socket发送数据时,英文字符转义后为原来本身的字符,占一个字节(如:s转移后为s),而中文
推荐度:
导读Python解析Socket数据流异常bytes的问题(详细):本篇文章给大家带来的内容是关于Python解析Socket数据流异常bytes的问题(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。python在通过socket发送数据时,英文字符转义后为原来本身的字符,占一个字节(如:s转移后为s),而中文


本篇文章给大家带来的内容是关于Python解析Socket数据流异常bytes的问题(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

python在通过socket发送数据时,英文字符转义后为原来本身的字符,占一个字节(如:s转移后为s),而中文字符在转义后需要二个字节来标识一个中文字符(如:钟转义后为x92x9f)。在发送端是不存在问题的,而发生问题的主要是在socket客户端。因为客户端在接受数据流时,每次接受都是有字节限制,就会出现一个中文字符分两次接受,从而导致每次接受的流在转义成字符时报错UnicodeDecodeError。

当前有数据流:

bmsg = b'xe5x88x86
xe9x92x9f' # 分
钟

正常接受并转义为:

smsg = str(bmsg, 'utf-8') #方式一 或 
smsg = bmsg.decode() # 方式二 第一参数默认utf8,第二参数默认strict,还有 ignore (忽略)、 replace (替代=?)

如果现在接受到的数据流为

bmsg = b'xe5x88x86
xe9x92' # x9f 作为下次接受

如何避免程序的异常退出,有两种处理方式:
1)数据丢失处理
此时,如果再用正常接受方式转义bytes流,就会出现 UnicodeDecodeError 异常,为使不报异常,我们在转义时,通过方式二,指定第二个参数为 ignore,如下:

smsg = bmsg.decode('utf-8', 'ignore') # 
输出: 分 ,如果为 replace 则 后为 ?

2)数据流拆分,再处理
一般socket服务端在发送数据时,每个数据流是完整的,并会以特定的字符(如: )结束一并发送。根据这种现状,我们在每次接受数据时,根据这个特定字符拆分(split)为一个保存单个数据流的列表。列表的第一个流可能为不完整,把它和上次接受的流合并为一个完整的数据流并转义;中间为可以正常转义的数据流;最后一个流也为不完整,保存下来,用来拼接下次接受的流,并重复上述操作,这样保障了程序不会异常退出,也保障数据的完整性。大致代码如下:
数据接受情况:

第一次接受 msg1 = b'xe5x88x86 xe9' ; # 钟 被拆分成 xe9 和 x92x9f
第二次接受 msg2 = b'x92x9f_stone '

init_msg = b'' # 初始化流
  while True:
    msg = soc.recv(128) # 接受数据
    init_msg += msg
    msg_arr = init_msg.split(b'
') # 注意此处的 b'
' ,因为被拆分的为bytes串,所以也要用bytes串来拆分
    init_msg += msg_arr[-1]
    msg_arr.remove(msg_arr[-1])
    for i in range(len(msg_arr)):
      string = msg_arr[i].decode('utf-8')
      print(string

文档

Python解析Socket数据流异常bytes的问题(详细)

Python解析Socket数据流异常bytes的问题(详细):本篇文章给大家带来的内容是关于Python解析Socket数据流异常bytes的问题(详细),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。python在通过socket发送数据时,英文字符转义后为原来本身的字符,占一个字节(如:s转移后为s),而中文
推荐度:
标签: 异常 问题 的问题
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top