【问题标题】:How to detect disconnection in python, without sending data如何在python中检测断开连接,而不发送数据
【发布时间】: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


【解决方案1】:

你需要单独检查recv()的结果到readbuffer

while True:
  c = socket.recv(4096)
  if c == '': break # no more data
  readbuffer = readbuffer + c.decode("UTF-8")
  ...

【讨论】:

  • 非常感谢您的帮助。现在我看那是我的一个主要笨蛋:P。
猜你喜欢
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 2012-11-03
  • 2011-08-06
  • 1970-01-01
  • 2019-06-23
相关资源
最近更新 更多