2016-11-08 117 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