擅长:python、mysql、java
<p>拉里·黑斯廷斯(Larry Hastings)的回答对sockets给出了一些很好的一般性建议,但是在Python socket模块中,<code>recv(bufsize)</code>方法的工作方式方面有一些错误。</p>
<p>因此,为了澄清,因为这可能会让其他寻求帮助的人感到困惑:</p>
<ol>
<li><code>recv(bufsize)</code>方法的bufsize参数不是可选的。如果调用<code>recv()</code>(不带参数),将得到一个错误。</li>
<li><code>recv(bufsize)</code>中的bufferlen是一个<em>最大</em>大小。如果可用的字节更少,recv将愉快地返回更少的字节。</li>
</ol>
<p>有关详细信息,请参见<a href="http://docs.python.org/library/socket.html" rel="noreferrer">the documentation</a>。</p>
<p>现在,如果您从客户机接收数据,并想知道何时接收到所有数据,您可能需要将其添加到您的协议中——正如拉里建议的那样。有关确定消息结尾的策略,请参见<a href="http://code.activestate.com/recipes/408859/" rel="noreferrer">this recipe</a>。</p>
<p>正如配方所指出的,对于某些协议,客户机在发送完数据后只需断开连接。在这种情况下,您的<code>while True</code>循环应该可以正常工作。如果客户机没有断开连接,则需要找到某种方法来表示内容长度、限定消息或实现超时。</p>
<p>如果你能发布你的客户机代码和测试协议的描述,我很乐意提供进一步的帮助。</p>