<p>当您使用<code>recv</code>与<code>select</code>连接时,如果套接字已准备好读取,但没有要读取的数据,则表示客户端已关闭连接。</p>
<p>下面是一些处理此问题的代码,还要注意在while循环中第二次调用<code>recv</code>时引发的异常。如果没有任何内容可供读取,则将引发此异常,但这并不意味着客户端已关闭连接:</p>
<pre><code>def listenToSockets(self):
while True:
changed_sockets = self.currentSockets
ready_to_read, ready_to_write, in_error = select.select(changed_sockets, [], [], 0.1)
for s in ready_to_read:
if s == self.serverSocket:
self.acceptNewConnection(s)
else:
self.readDataFromSocket(s)
</code></pre>
<p>以及接收数据的函数:</p>
<pre><code>def readDataFromSocket(self, socket):
data = ''
buffer = ''
try:
while True:
data = socket.recv(4096)
if not data:
break
buffer += data
except error, (errorCode,message):
# error 10035 is no data available, it is non-fatal
if errorCode != 10035:
print 'socket.error - ('+str(errorCode)+') ' + message
if data:
print 'received '+ buffer
else:
print 'disconnected'
</code></pre>