问题

在工作中经常会用到socket传输数据,例如客户端给服务器发送数据(双方约定了数据格式),在交测之前,自己用python写个接受数据的server,解析下拼成的数据格式是否正确。用python写比C语言简单很多。

PS:实际上我是不会python的,工作中是C/C++开发,使用python纯属是为了偷懒^_^

举个具体的例子:通信双方约定的数据格式为
          

数据格式为二进制的,python需要用到struct模块处理二进制数据。struct模块中最重要的三个函数pack(), unpack(), calcsize()。因为struct相当于C语言中的结构体,unpack()返回的是一个元组。struct支持的格式如下表

注1)q和Q只有在机器支持64位时有意义;

注2)每个格式前可以有一个数字,表示个数;

注3)s格式表示一定长度的字符串,4s表示长度为4的字符串,p表示的是pascal字符串;

注4)P用来转换一个指针,其长度和机器字长有关;

默认情况下struct根据本地机器字节顺序转换,也可以用格式中的第一个字符来改变对齐方式。定义如下:

注:无论数据包是python程序struct.pack()得到的,或者是C,C++,Java程序拼成的,只需保证client端和server端字节顺序保持一致即可。

以文章开头的例子来说明pack()和unpack()函数:

注:测试环境中中文为utf-8编码(python的编码折腾了半天,也没太懂,这里不是重点)

1)pack(format, v1, v2, ...)按照指定的格式(format),把数据封装成字符串,例如

>>s=struct.pack("2i13si6s2i", 33, 13, "www.baidu.com", 6, "冬季", 0, 0)

2)unpack(format, string)    按照给定的格式(fmt)解析字节流string,返回解析出来的tuple,例如
              >>us=struct.unpack("2i13si6s2i", s)

输出结果:

>>print us
              (33, 13, 'www.baidu.com', 6, '\xe5\x86\xac\xe5\xad\xa3', 0, 0)

注: 中文部分是二进制,从元组中取出来再打印

>> print us[4]
               冬季

注:对python下的中文编码感兴趣的同学可以研究下python环境编码(再次说明我真的不会python! >_<)

举个简单的例子:

#!/usr/bin/python
import socket
import struct
import os
import time if __name__ == "__main__":
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("127.0.0.1", 51001)) #本机端口号51001
server.listen(1)
while (1):
conn,client = server.accept()
conn.settimeout(5000) #设置超时时间
msg = conn.recv(4) #total data length
if len(msg) <= 0: #接收空数据包
continue
data = struct.unpack("i", msg)
print "Recv Total length:%d"%(data[0])
process_len = 0
msg = conn.recv(data[0])
for i in range(0,4): #循环四次,分别取 url title content author
para = msg[process_len:(process_len + 4)]
if len(para) < 4: #如果某一字段为空,不处理
continue
data = struct.unpack("i", para)
str_len = data[0]
print "%d"%(str_len)
para = msg[(process_len + 4):(process_len + 4 + str_len)]
if len(para) < str_len: #如果实际收到的字符串长度小于数据头给的长度,不处理
continue
data = struct.unpack("%ds"%(str_len), para)
print "%s"%(data[0])
process_len = process_len + 4 + str_len
conn.close()

python socket 二进制的更多相关文章

  1. Python socket编程之二:【struct.pack】&【struct.unpack】

    import struct """通过 socket 的 send 和 recv 只能传输 str 格式的数据""" "" ...

  2. python socket 实现的简单http服务器

    预备知识: 关于http 协议的基础请参考这里. 关于socket 基础函数请参考这里. 关于python 网络编程基础请参考这里. 一.python socket 实现的简单http服务器   废话 ...

  3. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  4. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  5. python socket发送魔法包网络唤醒开机.py

    python socket发送魔法包网络唤醒开机.py 现在的电脑应该都普遍支持有线网络的WOL了,支持无线网络唤醒的电脑,可能比较少. """ python socke ...

  6. Python Socket,How to Create Socket Server? - 网络编程实例

    文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...

  7. Python Socket,How to Create Socket Cilent? - 网络编程实例

    文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...

  8. Python Socket通信原理

    [Python之旅]第五篇(一):Python Socket通信原理   python Socket 通信理论 socket例子 摘要:  只要和网络服务涉及的,就离不开Socket以及Socket编 ...

  9. Python Socket单线程+阻塞模式

    Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要:  前面第五篇(一)中的一个Socket例子其实就是 ...

随机推荐

  1. Python-装饰器(语法糖)上下五千年和前世今生

    装饰器上下五千年和前世今生,这里我们始终要问,装饰器为何产生?装饰器产生解决了什么问题?什么样的需求推动了装饰器的产生?思考问题的时候,始终要问,为什么要这样,而不是那样或者其他样.这里我不先说,也不 ...

  2. Python-通过实例方法调用-统一接口的实现-getter methodcaller

    某项目中,我们的代码使用的2个不同库中的图形类: Circle,Triangle 这两个类中都有一个获取面积的方法接口,但是接口的名字不一样 统一这些接口,不关心具体的接口,只要我调用统一的接口,对应 ...

  3. 基于springboot工程浅谈整合rabbitmq怎么样防止消息发送mq不丢失和消费mq的消息防止丢失

    本文只针对springboot整合rabbitmq的消息防丢失,话不多说,上干货.... 设置发送mq消息不丢失实现思路 执行的方案: 第一步,要对队列,消息以及交换机进行持久化操作(保存到物理磁盘中 ...

  4. Arduino control Eeprom by IIC method of using device address in Arduino

    参考: 1.https://www.arduino.cc/ 2.https://www.arduino.cc/reference/en/ 3.https://www.arduino.cc/en/Ref ...

  5. 【从零开始撸一个App】Kotlin

    工欲善其事必先利其器.像我们从零开始撸一个App的话,选择最合适的语言是首要任务.如果你跟我一样对Java蹒跚的步态和僵硬的语法颇感无奈,那么Kotlin在很大程度上不会令你失望.虽然为了符合JVM规 ...

  6. # vue 如何通过前端来导出excel表格

    在做一些简单的demo时,偶尔会遇到导出excel表格.如果请后端帮忙的话 比较浪费时间,那么前端如何导出excel表格,下面就来记录一下之前使用到的案例 一.安装依赖 npm i file-save ...

  7. 网站搭建-云服务器ECS-镜像管理

    学习笔记: 快照,系统盘可创建镜像,数据盘不可以. 实例可以直接创建镜像,包括系统盘和数据盘 复制镜像: 新购服务器,选择镜像(又买). 共享镜像: 账号ID就是UID 云市场获取镜像; 1. 创建新 ...

  8. Brew error: Could not symlink, path is not writable

    As explained here by Rick: Start with brew doctor which will show you errors with your brew setup. Y ...

  9. ztree通过ajax加载json数据中文乱码的解决方法:springmvc配置

    一.问题描述 使用zTree的异步刷新父级菜单时,服务器返回中文乱码,但项目中使用了SpringMvc,已经对中文乱码处理,为什么还会出现呢? 此处为的异步请求的配置: async: { enable ...

  10. 第一个月多测师讲解__项目讲解以及注意事项(肖sir)

    一.目的讲解流程:(讲述业务时长10-15分钟为宜)1.自我介绍礼貌用语,姓名,籍贯,学校,个人技能,经验,表现,兴趣爱好等 ,1分钟 ,谢谢2.介绍项目的名字 ,项目的背景,(涉及什么架构)3.对项 ...