不能从套接字接收数据
我正在制作客户端服务器程序,并且客户端部分存在问题。 问题在于无限的接收数据。我已经在python解释器中测试了下面列出的这个特定的类。我已经succesfuly(也许不是)连接到谷歌,但后来程序功能recvData()数据= self.socket.recv采空(1024)不能从套接字接收数据
class client():
def __init__(self, host, port):
self.host = host
self.port = port
self.socket = self.connect()
self.command = commands()
def connect(self):
'''
Connect to a remote host.
'''
try:
import socket
return socket.create_connection((self.host, self.port))
except socket.error:
print(":: Failed to connect to a remote port : ")
def sendCommand(self, comm):
'''
Send command to remote host
Returns server output
'''
comman = comm.encode()
# for case in switch(comman):
# if case(self.command.RETRV_FILES_LIST.encode()):
# self.socket.send(b'1')
# return self.recvData()
# if case():
# print(":: Got wrong command")
if (comman == b'1'):
self.socket.send(b'1')
return self.recvData()
def recvData(self):
'''
Receives all the data
'''
i = 0
total_data = []
while(True):
data = self.socket.recv(1024)
if not data: break
total_data.append(data)
i += 1
if i > 9:
break
return total_data
有关评论部分: 我在案例的实现思想的问题,所以只使用if语句。但事实并非如此。
您的问题是,self.socket.recv(1024)
只有在服务器端关闭套接字并收到所有数据时才返回空字符串。您编写客户端的方式,并不知道已收到完整的消息并等待更多消息。你如何处理这个问题很大程度上取决于服务器使用的协议。
考虑一个Web服务器。它发送一个由行分隔的头部,其中包含一个content-length
参数,告诉客户端它应该读取多少字节。客户端扫描换行符,直到头部完成,然后使用该值做recv(exact_size)
(如果很大,它可以读取块),以便在最后一个字节进入时recv不会阻塞。
即便如此,有做决定。客户端知道网页有多大,但可能需要向调用者发送部分数据,以便在接收到所有数据之前开始绘制页面。当然,调用者需要知道发生了什么 - API本身有一个协议或一组规则。
您需要定义客户端如何知道消息是否完整以及它返回给调用者的具体内容。处理这个问题的一个好方法是让其他一些协议如[zeromq](http://zeromq.org/)为你完成工作,一个简单的python客户端/服务器可以用xmlrpc来实现,还有很多其他的方法。你说你正在实施一个客户端/服务器程序,然后你提到“连接到谷歌”和telnet ......这些都是非常不同的事情,一个客户端策略将不会与所有的人一起工作
你调用'recvData '并且它永远挂起? – tdelaney
你能否添加一些有关运行代码的结果的信息(你是否得到一个异常?默默地结束?挂起?),以及你期望的结果是什么? – glibdud
是的,它是阻止接收数据 – Fireship