已经用C开发好了一个发送TCP数据包的网络程序,用于向另一个程序传送消费订单,现在需要用python开发一个测试数据,测试传送的数据是否正确。在网络通信里我们一般传送的数据格式是二进制,如“0x12345678”,这个在C语言里定义很简单,就是用结构体定义,而在python里,我们也可以使用struct,从而将二进制数据转换成我们需要的值格式。
以下为该程序的简单示例,该程序会监听8801端口,接收新的客户端连接及数据包,数据的前8个字节是两个int类型数据,unpack出cmd_id,以此来判断消息类型,并unpack出我们需要的各种消息数据。
#!/usr/bin/env python
import struct
from socket import *
from time import ctime
HOST = ''
PORT = 8801
ADDR = (HOST, PORT)
servSock = socket(AF_INET, SOCK_STREAM)
servSock.bind(ADDR)
servSock.listen(5)
while True:
print "waiting for connection..."
cliSock, addr = servSock.accept()
print "...connected from:", addr
while True:
data = cliSock.recv(1024)
if not data:
break
msg_len, cmd_id = struct.unpack_from('!2i', data, 0)
print msg_len, cmd_id
if(cmd_id == 304):
roomno, sequence, type, name_ch, code, count, price, total = struct.unpack_from('!16sQ50s50s16sQ6s6s', data, 8)
print "order:", roomno, sequence, type.decode('gb2312'), name_ch.decode('gb2312'), code, count, price, total
bytes = struct.pack('!2i', 32769, 8)
cliSock.send(bytes)
cliSock.close()
servSock.close()