2011-10-04 86 views
1

所以我正在研究一個Python IRC框架,並且我正在使用Python的socket模塊。我喜歡使用Twisted嗎?不,不是。Python socket模塊的問題

無論如何,我有一個無限循環讀取和處理來自socket.recv(xxxx)的數據,其中xxxx在這種情況下真的無關緊要。我使用str.split("\r\n")將收到的數據拆分爲消息,並逐個處理它們。

我的問題是,我必須設置在socket.recv()特定的「讀取大小」來定義多少數據從套接字讀取。當我收到一連串的數據時(例如,當我連接到IRC服務器並接收到MOTD.etc時),總會有一條消息跨越插槽的兩個「讀取」(即部分行被讀入一個socket.recv()其餘的則在無限循環的下一次迭代中讀取)。

我不能處理半收到的消息,我不知道是否有連破案的一種方式。在理想情況下,我會收到緩衝區中的所有內容,但它看起來不像socket提供了一種方法。

任何幫助?

+0

爲什麼另起爐竈?現在已經有很多解決方案可以做到這一點,Twisted恰好是最通用的。 – jathanism

+0

爲什麼你不想使用Twisted? – dicato

回答

4

你真的應該使用selectpoll,例如通過asyncoreselect,或扭曲(你不喜歡)。

從你永遠不知道你會收到多少在每讀一個插座閱讀。您可以一次接收幾條消息,或者將一條消息分成多個讀取。您應該始終將數據收集到緩衝區中,直到可以使用它爲止,然後從緩衝區中刪除已使用的數據(但保留尚未使用的數據)。

既然你知道你的輸入,使通過線感測線,那麼你收到迴路可以看起來像:

  • 而真實:
    • 附加新數據緩衝
    • 查找EOLS,過程並刪除所有的完整生產線
+0

我正在做類似的事情;我將輸入拆分成行,並將行添加到輸入緩衝區。我想我可以使用換行符的存在來確定接收的數據是否是「完整的」。 –

+0

是的,在你的情況下,換行符決定消息的結束 – orip

0

流模式插座(例如,TCP)永遠無法保證你在任何種類整齊成幀方式接收消息。如果您收到部分輸入線路 - 有時會出現 - 您需要保持局部線路,直到線路的其餘部分出現。

使用Twisted將爲您節省大量時間。更好的是,您可能需要考慮使用現有的IRC框架 - 其中有一些已經可用。