【问题标题】:Python client disconnect if server closes connection如果服务器关闭连接,Python客户端断开连接
【发布时间】:2015-01-15 16:34:07
【问题描述】:

我在 python 中有服务器和客户端代码,其中客户端向服务器发送请求消息并等待响应。当客户端没有发送正确的请求时,我有服务器代码来关闭连接。当服务器关闭请求时,客户端仍然一直在监听响应。

下面是代码

server.py

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host, port))

s.listen(1)

while True:

  c, addr = s.accept()

  # Receive request
  data = c.recv(1024)
  if data != 'something'
    c.close()
  else
    c.sendall("message"+"End")
    c.close()
s.close()

客户端.py

End='End'
def recv_end(the_socket):
  # Snippet from http://code.activestate.com/recipes/408859-socketrecv-three-ways-to-turn-it-into-recvall/
  total_data=[];data=''
  while True:
    data=the_socket.recv(8192)
    if End in data:
      total_data.append(data[:data.find(End)])
      break
    total_data.append(data)
    if len(total_data)>1:
      #check if end_of_data was split
      last_pair=total_data[-2]+total_data[-1]
      if End in last_pair:
        total_data[-2]=last_pair[:last_pair.find(End)]
        total_data.pop()
        break
  return ''.join(total_data)

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host, port))

s.send("some_request")
data = s.recv_end(1024)
print "<---- " + str(data)

s.close()

我是 python 新手,想知道是否有办法让客户端知道服务器关闭了连接并终止。

我知道如果我使用普通的s.recv(1024),客户端会断开连接。但就我而言,我需要向客户端发送大量数据,因此我使用了从http://code.activestate.com/recipes/408859-socketrecv-three-ways-to-turn-it-into-recvall/ 找到的不同功能。

是否就像服务器在连接关闭期间发送一个空字符串回复一样,在我的情况下,它会发送一个没有结束限制器的空字符串,因此客户端一直在监听?

【问题讨论】:

  • 您的客户是否在s.recv(1024) 通话中挂起?还是返回一个空响应?
  • 我尝试了您的代码(在修复了服务器中缺少的: 之后)并且我无法重现:客户端显示空字符串并且存在,如果我将其修改为发送something,它会显示&lt;---- message并退出。
  • @SergeBallesta 请检查我所做的编辑。我正在使用不同的函数来接收端限制器,因为我需要传输大量数据。

标签: python python-2.7 python-sockets


【解决方案1】:

当您有一个带有recv 的循环或任何从套接字或管道读取的内容时,您应该在获得 len 0 的缓冲区后立即停止读取:

while True:
    data=the_socket.recv(8192)
    if len(data) == 0: break
    ...

【讨论】:

  • 那么,在关闭时,服务器会发送一个空响应?这是客户端知道连接已关闭的唯一方法?
  • 不完全是。但是当对等端的套接字关闭时,另一端的读取将中止并返回 0 字节。从真正的文件中读取时,它与 eof 的逻辑相同。
猜你喜欢
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2012-06-10
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多