2009-11-26 78 views
1

我是Python新手(雖然我已經使用Java進行了多年的編程,但是我正在研究一個簡單的基於套接字的網絡應用程序(僅僅爲了好玩))。我的想法是,我的代碼連接到遠程TCP端點,然後監聽從服務器推送到客戶端的任何數據,並對此執行一些解析。使用asyncore讀取套接字緩衝區

從服務器 - >客戶端推送的數據是UTF-8編碼文本,每行由CRLF\x0D\x0A)定界。你可能猜到了:這個想法是,客戶端連接到服務器(直到被用戶取消),然後讀取和解析這些線路。

我已經設法讓這個工作,但是,我不確定我是否以正確的方式來做這件事。所以因此我的實際問題(代碼如下):

  1. 這是做在Python正確的方式(即是不是真的這樣簡單的)?
  2. 有關緩衝區/ asyncore的任何提示/技巧/有用資源(除了參考文檔)?

目前,該數據被讀出並緩存的如下:

def handle_read(self): 
    self.ibuffer = b"" 

    while True: 
     self.ibuffer += self.recv(self.buffer_size) 
     if ByteUtils.ends_with_crlf(self.ibuffer): 
      self.logger.debug("Got full line including CRLF") 
      break 
     else: 
      self.logger.debug("Buffer not full yet (%s)", self.ibuffer) 

    self.logger.debug("Filled up the buffer with line") 
    print(str(self.ibuffer, encoding="UTF-8")) 

ByteUtils.ends_with_crlf該功能簡單地檢查緩衝區\x0D\x0A的最後兩個字節。第一個問題是主要的問題(答案是基於此),但任何其他的想法/提示都值得讚賞。謝謝。

+0

我很好奇ByteUtils在您的代碼中的位置,所以我使用「python ByteUtils」...和谷歌給了我這個線程 - 創建15分鐘後!這是令人印象深刻的:) – truppo 2009-11-26 18:23:59

回答

6

TCP是一個流,你不能保證你的緩衝區不會包含一個消息的結尾和下一個消息的開始。 因此,在緩衝區末尾檢查\ n \ r在所有情況下都無法按預期工作。您必須檢查流中的每個字節。

而且,我強烈建議您使用Twisted而不是asyncore。 這樣的事情(從內存中,可能無法工作開箱):

from twisted.internet import reactor, protocol 
from twisted.protocols.basic import LineReceiver 


class MyHandler(LineReceiver): 

    def lineReceived(self, line): 
     print "Got line:", line 


f = protocol.ClientFactory() 
f.protocol = MyHandler 
reactor.connectTCP("127.0.0.1", 4711, f) 
reactor.run() 
+0

我知道服務器通過所有以CRLF結束的「線路」發送,所以我確信在一個時間點緩衝區將被終止(除非服務器端出現錯誤,發送這個到一些形式的緩衝區溢出,我猜沒有任何時間)。 我已經閱讀了關於Twisted的文章,但是對於Python 3還沒有完成AFAIK,並且可能會爲此過度使用。 – tmbrggmn 2009-11-26 19:29:14

+0

您目前的代碼仍然存在多行而不是一行的風險。 – truppo 2009-11-26 22:26:39

+0

耶! +1扭曲! – nosklo 2009-11-27 02:38:11

6

這是更簡單 - 看asynchat及其set_terminator方法(和模塊中其他有用的花絮)。 Twisted的數量級更豐富和更強大,但是,對於足夠簡單的任務,asyncore和asynchat(旨在順利進行互操作)確實非常易於使用,正如您開始觀察的那樣。

+1

我先嚐試了asynchat,但遇到了一些我無法直接解決的問題(與緩衝區有關),所以我恢復爲asyncore。 – tmbrggmn 2009-11-26 19:30:27

+3

+1使用asyncore/asynchat而不是Twisted來處理這些簡單的任務。 – 2009-11-27 06:07:19

+0

@Denis:我認爲上面這個扭曲的例子非常簡單,直截了當,不是嗎? – nosklo 2009-11-30 12:49:11