2016-11-08 145 views
0

我正在制作客户端服务器程序,并且客户端部分存在问题。 问题在于无限的接收数据。我已经在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语句。但事实并非如此。

+0

你调用'recvData '并且它永远挂起? – tdelaney

+0

你能否添加一些有关运行代码的结果的信息(你是否得到一个异常?默默地结束?挂起?),以及你期望的结果是什么? – glibdud

+0

是的,它是阻止接收数据 – Fireship

回答

0

您的问题是,self.socket.recv(1024)只有在服务器端关闭套接字并收到所有数据时才返回空字符串。您编写客户端的方式,并不知道已收到完整的消息并等待更多消息。你如何处理这个问题很大程度上取决于服务器使用的协议。

考虑一个Web服务器。它发送一个由行分隔的头部,其中包含一个content-length参数,告诉客户端它应该读取多少字节。客户端扫描换行符,直到头部完成,然后使用该值做recv(exact_size)(如果很大,它可以读取块),以便在最后一个字节进入时recv不会阻塞。

即便如此,有做决定。客户端知道网页有多大,但可能需要向调用者发送部分数据,以便在接收到所有数据之前开始绘制页面。当然,调用者需要知道发生了什么 - API本身有一个协议或一组规则。

您需要定义客户端如何知道消息是否完整以及它返回给调用者的具体内容。处理这个问题的一个好方法是让其他一些协议如[zeromq](http://zeromq.org/)为你完成工作,一个简单的python客户端/服务器可以用xmlrpc来实现,还有很多其他的方法。你说你正在实施一个客户端/服务器程序,然后你提到“连接到谷歌”和telnet ......这些都是非常不同的事情,一个客户端策略将不会与所有的人一起工作

+0

感谢您的回答! 问题在发送消息到谷歌没有行结尾'\ n' 但谢谢你的zeromq,它适合完美的我的宠物项目:) – Fireship

+0

@Fireship太棒了!简单阅读zeromq模式是对地球上网络编程的最佳介绍。 – tdelaney