如果服务器关闭连接,Python客户端将断开连接 [英] Python client disconnect if server closes connection

查看:849
本文介绍了如果服务器关闭连接,Python客户端将断开连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在python中有服务器和客户端代码,其中客户端向服务器发送请求消息并等待响应.当客户端未发送适当的请求时,我具有服务器代码来关闭连接.当服务器关闭请求时,客户端仍然永远在侦听响应.

I have server and client code in python in which client sends a request message to server and wait for the response. I have the server code to close the connection when the client doesn't send a proper request. When the server closes the request, the client still is listening forever for the response.

下面是代码

server.py

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()

Client.py

Client.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的新手,想知道客户端是否有办法知道服务器已关闭连接并终止.

I'm new to python and wondering if there is a way for the client to know that the server closed the connection and terminate.

我了解,如果我使用普通的s.recv(1024),客户端将断开连接.但就我而言,我需要向客户端发送大数据,因此我使用了从

I understand that the client would disconnect if I use normal s.recv(1024). But in my case, I need to send large data to the client so I have used a different function I found from http://code.activestate.com/recipes/408859-socketrecv-three-ways-to-turn-it-into-recvall/.

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

Is it like the server sends a empty string reply during the close of a connection and in my case, it would send a empty string without the end limiter and hence the client is listening forever ?

推荐答案

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

When you have a loop with recv or anything that reads from a socket or a pipe, you should stop reading as soon as you get a buffer with len 0 :

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

这篇关于如果服务器关闭连接,Python客户端将断开连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆