我在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()
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的新手,想知道客户端是否有办法知道服务器关闭连接并终止。
我知道如果我使用普通s.recv(1024)
,客户端会断开连接。但就我而言,我需要向客户端发送大量数据,因此我使用了http://code.activestate.com/recipes/408859-socketrecv-three-ways-to-turn-it-into-recvall/中找到的不同功能。
它是否像服务器在连接关闭期间发送空字符串回复一样,在我的情况下,它会发送一个没有结束限制器的空字符串,因此客户端正在永远收听?
答案 0 :(得分:2)
当你有一个recv
的循环或从套接字或管道读取的任何东西时,你应该在获得一个len 0的缓冲区后立即停止读取:
while True:
data=the_socket.recv(8192)
if len(data) == 0: break
...