【发布时间】:2015-03-17 23:44:16
【问题描述】:
好的,我有一个套接字,我一次处理一行并记录它。下面的代码非常适合。 cout 函数是我用来向日志发送数据的函数。我使用的 for 循环,因此我可以一次处理一行。
socket.connect((host, port))
readbuffer = ""
while True:
readbuffer = readbuffer+socket.recv(4096).decode("UTF-8")
cout("RECEIVING: " + readbuffer) #Logs the buffer
temp = str.split(readbuffer, "\n")
readbuffer=temp.pop( )
for line in temp:
#Handle one line at a time.
我遇到了一个问题,当服务器断开我的连接时,突然间我有一个巨大的文件,里面全是“RECEIVING:”这个词。我知道这是因为当 python 套接字断开连接时,套接字开始不断接收空白数据。
我试过插入:
if "" == readbuffer:
print("It disconnected!")
break
所做的只是立即中断循环,并说它已断开连接,即使连接成功也是如此。
我也知道我可以通过发送数据来检测断开连接,但我不能这样做,因为我发送的任何内容都会广播到服务器上的所有其他客户端,这是为了调试这些客户端,所以我会干扰。
我该怎么办。提前谢谢你。
【问题讨论】:
-
是
string.split还是str.split?因为我没有看到导入或str标识符。 -
str.split('hello\nworld', '\n')很好,如果有点不合常规 - 只需调用str内置的未绑定方法,而不是'hello\nworld'对象的绑定方法。 -
请注意,除非您愿意使用 keep-alive(或超时),否则您无法始终在不写入的情况下检测(突然)断开连接。这对于 TCP 来说是非常普遍的,与语言无关(请参阅 links from this answer)。
标签: python sockets logging exception-handling disconnect