python中socket发送也研究了半天

这篇博客探讨了在Python中使用socket进行TCP通信时,如何打包数据以符合特定格式,尤其是通过struct.pack处理byte、int和字符串的组合。作者在实验中遇到struct.pack的fmt参数导致的字节长度问题,并分享了简单的发送实现代码,包括创建了一个PackArgument类来辅助构造报文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要做测试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长度:

# -*- 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!





评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值