擅长:python、mysql、java
<p>您的客户端发送JSON。然后,服务器读取整个JSON消息并尝试将其解释为整数。轰</p>
<p>传输完整消息基本上有3个选项:发送字节,并假设您从一次读取中接收到整个消息,而不是更多(最不可靠);使用分隔符(<em>,例如</em>,CRLF),并确保它不会出现在消息中(受限数据流);或者发送一个字节计数,后跟消息字节(长度+数据,最可靠)。看起来您混合了第一种和第三种方法,这基本上不起作用</p>
<p>要使用length+数据将dict序列化为JSON传输,首先JSON对dict进行编码,然后UTF8对结果字符串进行编码以获得消息字节。从这一点开始,直到服务器反序列化消息,代码都在使用字节</p>
<p>要发送长度+数据,<code>struct</code>模块是您的朋友。定义打包/解包说明符(基本上是选定的大小整数加上bytestring)。例如,<code>"!Hs"</code>将支持高达64K的消息bytestring</p>
<p>在客户端</p>
<ul>
<li>获取UTF8编码消息字符串的编码长度</李>
<li>使用<code>struct.pack</code>创建二进制消息(<;长度头>;<;消息字节>;)</李>
<li>使用<code>socket.sendall</code>发送二进制消息(发送消息可能需要多次<code>send</code>调用,而<code>sendall</code>会为您处理这些调用)</李>
</ul>
<p>在服务器中</p>
<ul>
<li>使用<code>socket.recv</code>只接收<em>头字节</em>(<em>例如</em>、4或8字节)</李>
<li>使用<code>struct.unpack</code>解压字节计数</李>
<li>使用<code>socket.recv</code>仅接收<em>消息字节</em>(<em>即</em>,<em>字节计数</em>字节)</li>
<li>要从接收的(序列化的)消息字节反序列化dict,请先进行UTF8解码,然后进行JSON解码</李>
</ul>