Python解析Socket数据流异常bytes问题 -- 2019-03-12

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

当前有数据流:

bmsg = b'\xe5\x88\x86\n\xe9\x92\x9f' # 分\n钟

正常接受并转义为:

smsg = str(bmsg, 'utf-8')   #方式一

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

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

bmsg = b'\xe5\x88\x86\n\xe9\x92'    # \x9f 作为下次接受

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

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

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

  init_msg = b'' # 初始化流
  while True:
    msg = soc.recv(128) # 接受数据
    init_msg += msg
    msg_arr = init_msg.split(b'\n') # 注意此处的 b'\n' ,因为被拆分的为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问题的更多相关文章

  1. 「Python」socket指南

    开始 网络中的 Socket 和 Socket API 是用来跨网络的消息传送的,它提供了 进程间通信(IPC) 的一种形式.网络可以是逻辑的.本地的电脑网络,或者是可以物理连接到外网的网络,并且可以 ...

  2. 操作系统底层原理与Python中socket解读

    目录 操作系统底层原理 网络通信原理 网络基础架构 局域网与交换机/网络常见术语 OSI七层协议 TCP/IP五层模型讲解 Python中Socket模块解读 TCP协议和UDP协议 操作系统底层原理 ...

  3. python初探 socket

    1.什么是socket? Socket中文译作:套接字,但是大家一般约定俗称的都用:socket.我想在解释socket是什么之前,先说它是用来干嘛的:socket是来建立‘通信’的基础,建立连接,传 ...

  4. pcapng文件的python解析实例以及抓包补遗

    为了弥补pcap文件的缺陷,让抓包文件可以容纳更多的信息,pcapng格式应运而生.关于它的介绍详见<PCAP Next Generation Dump File Format> 当前的w ...

  5. python的socket的学习

    一.Socket相关知识 1.socket是什么: socket是应用层与TCP/IP协议族通信的中间软件抽象层,他是一组接口.在设计模式中,Socket其实就是一个门面模式. 它把复杂的TCP/IP ...

  6. python之Socket网络编程

    什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...

  7. Python底层socket库

    Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...

  8. [python]初探socket

    1.什么是socket? Socket中文译作:套接字,但是大家一般约定俗称的都用:socket.我想在解释socket是什么之前,先说它是用来干嘛的:socket是来建立'通信'的基础,建立连接,传 ...

  9. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

随机推荐

  1. android adb command

    一.adb启动activity: $ adb shell$ am start -n {包(package)名}/{包名}.{活动(activity)名称} 如:启动浏览器 # am start -n ...

  2. RXjava的简介

    API 介绍和原理简析 1. 概念:扩展的观察者模式 观察者模式面向的需求是:举一个例子,警察在小偷实施作案的时候实施抓捕,在这一个例子中警察是观察者,小偷是被观察者.但是程序的观察者模式和这个还是有 ...

  3. servlet中Session的用法

    ## (1)什么是Session? 服务器端为了保存用户的状态而创建的一个特殊的对象(即session对象).          当浏览器第一次访问服务器时,服务器会创建session对象(该    ...

  4. [SHOI2009]Booking 会场预约

    题目:洛谷P2161. 题目大意:有一些操作,分为两种: A.增加一个从第l天到第r天的预约,并删除与这个预约冲突的其他预约,输出删除了多少个预约. B.输出当前有效预约个数. 两个预约冲突定义为两个 ...

  5. [POJ2823][洛谷P1886]滑动窗口 Sliding Window

    题目大意:有一列数,和一个窗口,一次能框连续的s个数,初始时窗口在左端,不断往右移动,移到最右端为止,求每次被框住的s个数中的最小数和最大数. 解题思路:这道题是一道区间查询问题,可以用线段树做.每个 ...

  6. 批量删除harbor中的镜像

    一 说明 这个是我第一篇博客,所以我想放上原创的东西,尽管我一直都很担心自己写得太low,但是总要学会尝试,学会改变自己,相信自己.在写这个脚本时,由于我接触LInux不是很多,能力有限,仅仅是为了让 ...

  7. 紫书 例题 11-1 UVa 12219 (表达式树)

    这道题看了刘汝佳的代码真的是天秀, 很值得学习. 具体看代码 #include<cstdio> #include<iostream> #include<cctype> ...

  8. 实验二实验结论&实验总结与体会

    Part1:格式化输出函数printf()和格式化输入函数scanf() ① /* <C语言程序设计教程学习指导>p118 实验内容(1) 这是一个常用格式控制符使用示例 运行程序,结合运 ...

  9. zoj 1655 单源最短路 改为比例+最长路

    http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=655 没有理解清题意就硬套模板.所以WA了好几次. 解析看我的还有一篇http ...

  10. vb.net版机房收费系统——教你七层架构(三)—外观模式

    上次我们看到了D层是如何运作的,如今.我简单演示一下我的外观和B层是如何和U层和D层打交道的. 首先我跟大家说的是我的外观是依照界面功能划分的,粒度有点小,大家在做的时候,记得外观有几个即可了,可是不 ...