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. (转载) 据说年薪30万的Android程序员必须知道的

    据说年薪30万的Android程序员必须知道的帖子 标签: android 2015-03-12 16:52 28705人阅读 评论(14) 收藏 举报 Android中国开发精英 目前包括: And ...

  2. direct2d: antialiasing and drawing a line with a 1 pixel stroke

    http://xboxforums.create.msdn.com/forums/t/61448.aspx I'm currently porting a number of custom MFC C ...

  3. rem 使用

    html{ font-size:12px; } .btn { width: 6rem; height: 3rem; line-height: 3rem; font-size: 2rem; displa ...

  4. 根据SPID查找SQL语句

      SELECT   /*+ ORDERED */          sql_text     FROM v$sqltext a    WHERE (a.hash_value, a.address) ...

  5. 优动漫PAINT-朱槿花的画法

    火红夺目的朱槿花,绝对是烘托画面的绝佳布景!画法发非常简单,毫无绘画基础的人也能够将它很好的呈现出来哟~ 教程是简单,呃.... 没有优动漫PAINT软件肿么办? 别着急,╭(╯^╰)╮ 小编给你送来 ...

  6. ztree连接数据库,实现下拉菜单

    $(document).ready(function(){ var treeObj = $("#treeDemo"); $.fn.zTree.init(treeObj, setti ...

  7. python_if_else,while,break

    #密码密文展示,getpass在pycharm中无法使用,只能在python中使用import getpass #登录判断'''raw_name="Monica"raw_passw ...

  8. python 退出程序的执行

    使用sys.exit()退出当前程序的执行 import sys if x==0: sys.exit()

  9. 解决jquery动态增加元素后children值没有变的问题

    html代码如下: <ul id="attr_input_panel"> <li> <div class="attr_input_item& ...

  10. POJ——T2117 Electricity

     http://poj.org/problem?id=2117 Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5459   ...