|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 china25qd 于 2017-12-9 14:16 编辑
我写了一个TCP服务器
- import sys
- import socket
- serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- host = "127.0.0.1"
- port = 8088
- bufsize = 1024
- def int_to_bytes(x):
- return x.to_bytes((x.bit_length() + 7) // 8, 'big')
- def int_from_bytes(xbytes):
- return int.from_bytes(xbytes, 'big')
- serversocket.bind((host,port))
- serversocket.listen(5)
- print("我的地址:%s"% str(socket.gethostbyname(host)))
- print("端口:%s"% str(port))
- while True:
- clientsocket,addr = serversocket.accept()
- print("链接地址:%s"% str(addr))
- msg = "hello client!"+"\r\n"
- msglen = int_to_bytes(len(msg))
- msgbyte = msglen + msg.encode('utf-8')
- print(msglen)
- print("发送字符长度:%s"%str(int_from_bytes(msglen)))
- print("校验长度:%s"%str(len(msgbyte)))
- clientsocket.send(chr(len(msgbyte)).encode()+msgbyte)
- clientmsg = clientsocket.recv(bufsize)
- data = ''
- data = str(clientmsg[4:len(clientmsg)],encoding="utf-8")
- print("客户端发来校验值:%s"%str(int_from_bytes(clientmsg[0:1])))
- print("客户端发来字长:%s"%str(int_from_bytes(clientmsg[2:3])))
- print("客户端说:%s"% data)
- clientsocket.close()
复制代码
用来和我的客户端通信(客户端是unity的,不是python)
然后问题来了,客户端发送的msg,流的前4位是校验值,格式是:总长度[长度[消息]]
每一个长度都是一个int16转化的bytes,且都占两位
而python的int转换bytes就占一位,以至于我回发的消息总是在前面被截掉两位
从原来的“hello client!”变成了“llo client!”
请问这个应该怎么办呢?
补充一下,我的客户端用的是现成的socket通信框架,如果改校验,会发生一些奇怪的崩溃,所以只能在服务器上想办法 |
|