python中socket发送也研究了半天
2015-08-12 16:14
537 查看
需要做测试tcp通讯工具,socket本来就没什么,就是它要发送内容如何打包的问题。从最原先的struct.pack到bytearray,再到bitarray,后来又回到了struct.pack,其实这就足够我使用了。
测试中,需要发送的内容是 byte+int+byte+string+0,意思分别是 版本号,数据长度,接口标识,本接口的内容(这个接口只接受单个字符串,字符串后面需要0结束)。
python中我算是非常新手,研究中发现,其实str类型加上struct.pack就可以完成我的需求,但其中pack有一个奇怪的问题,pack中的fmt参数,同样的b,后面跟i会拿到b增加到4byte长度:
输出:
'\x01'
'\x01\x00\x00\x00\x01\x00\x00\x00'
'\x011'
这个没有时间去了解为什么。后面就写了一下简单的发送实现代码:
服务端输出:
User admin sign in.
User:admin disconnect!
测试中,需要发送的内容是 byte+int+byte+string+0,意思分别是 版本号,数据长度,接口标识,本接口的内容(这个接口只接受单个字符串,字符串后面需要0结束)。
python中我算是非常新手,研究中发现,其实str类型加上struct.pack就可以完成我的需求,但其中pack有一个奇怪的问题,pack中的fmt参数,同样的b,后面跟i会拿到b增加到4byte长度:
# -*- coding:utf-8 -*- import struct data = struct.pack("b", 1) print repr(data) data = struct.pack("bi", 1, 1) # 这里的b居然占了4个byte print repr(data) data = struct.pack("bs", 1, "1") print repr(data)
输出:
'\x01'
'\x01\x00\x00\x00\x01\x00\x00\x00'
'\x011'
这个没有时间去了解为什么。后面就写了一下简单的发送实现代码:
# -*- coding:utf-8 -*- import time import struct from socket import * serverHost = 'localhost' serverPort = 2950 sockobj = socket(AF_INET, SOCK_STREAM) sockobj.connect((serverHost, serverPort)) userName = "admin" userName = bytes(userName) ''' 合并后面的参数,参数只有四种 单字节 双字节 四字节 字符串,需带0结尾 调用append追加, 字符串的时候 pack.append('我是字符串') 单字节 pack.append(10, 1) 双字节 pack.append(10, 2) 四字节 pack.append(10, 4) 由于python的数字转换后是低位在前,所在需要反序 ''' class PackArgument(): length = 0 content = ""; def append(self, cont, num=0): if (num == 0): self.content += bytes(cont) + '\x00'; else: fmt = 'b' if (num == 2): fmt = 'h' elif num == 4: fmt = 'i' cont = struct.pack(fmt, cont); cont = cont[::-1]; self.content += cont; ''' 合并报文头 版本号 长度 调用功能 ''' def initPack(serverHandler, content): contLen = len(content) + 6 packed = struct.pack("i", contLen) packed = '\x01' + packed[::-1] + struct.pack('b', serverHandler) + content return packed packArgument = PackArgument() packArgument.append("admin") buff = initPack(1, packArgument.content) data = sockobj.send(buff) print 'client received:', repr(data) time.sleep(3); sockobj.close();
服务端输出:
User admin sign in.
User:admin disconnect!
相关文章推荐
- 【练习册】 2015-08-10 ClassicTrie by python
- 安装Python包出现 Unable to find vcvarsall.bat
- 64位系统下,numpy 和 Python 安装
- 学习python自动化运维之模块域名解析方法详解
- python快速入门
- python 导入库问题
- 如何用python解析mnist图片
- 学习python自动化运维diff-text
- 学习python自动化运维笔记文件比较
- python获得两个数组交集、并集、差集的方法
- Python中关于字符串的问题
- python多线程编程: 使用互斥锁同步线程
- 一个类似的python消息响应机制的实现
- wxPython Cookbook (Chatper1)part 1
- windows7 安装python第三方包psycopg2
- python urllib/urllib2 get/post使用详解
- python操作数据库
- python filter/map/reduce
- Python 巧用set()去重
- python下载视频