2012-05-20 58 views
2

我正在製作一個與Twisted套接字通信的iPhone應用程序,當我有一條消息發送時它工作得很好。然而,我的問題是我需要發送許多不同的信息到應用程序。這是我的代碼。扭曲套接字立即發送消息

  if numrows == 1: 
       #Did login 
       msg = "%s: Login Credentials Success" % _UDID 
       print msg 
       for c in self.factory.clients: 
        c.message(msg) 
        time.sleep(0.5) 

       for result in results: 
        for i in range(1, 6): 
         msg = "%s:L%d;%s" % (_UDID, i, result[i]) 
         print msg 
         for c in self.factory.clients: 
          c.message(msg) 
          time.sleep(0.5) 
      else: 
       msg = "%s: Login Credentials Failed" % _UDID 
       print msg 
       for c in self.factory.clients: 
        c.message(msg) 
        time.sleep(0.5) 

      cursor.close() 
      database.close() 

     #print msg 

     #for c in self.factory.clients: 
      #c.message(msg) 

def message(self, message): 
    self.transport.write(message) 

說我是派只是第味精,和所有其他味精並沒有隨着印刷和每個味精以下方式存在,消息登錄憑據成功將被髮送到應用程序。但是,如果像你如何看待它一樣放在其他地方,即使在代碼中放一段時間,它也不會一下子發生,因爲它一次發送完畢。

該應用程序每隔0.05秒或更少檢查響應。儘管登錄憑證位於頂部,但它並未通過,因爲之後會發送更多信息,但沒有憑證消息之後的所有信息都會通過。

我非常渴望找到答案。我試過了我能想到的一切。該應用程序不是問題,它是Python。

謝謝。

+0

請勿在Twisted reactor線程中使用time.sleep(或任何阻塞函數)。 –

+0

@ Jean-PaulCalderone我用它來測試它,但它不起作用。在發佈後我發現不使用time.sleep()。 – Alec

回答

1

你的問題似乎是Twisted緩衝你寫入它的數據。

顯然,沒有簡單的方法來強制數據自己發送而不用重構大量的代碼。見Twisted transport.writeUsing Twisted's twisted.web classes, how do I flush my outgoing buffers?

不知道你的代碼是什麼樣子的剪斷,然後粘貼,並根據最後一個環節的接受的答案:

  • 定義wait功能,只是因爲它是公認的答案
  • 化妝確保您的類從http.Request
  • 繼承裝點你的方法messagedefer.inlineCallbacks
  • 添加yield wait(N)(對,你必須TES N的值在message方法

調用write後T和確定)我沒有與扭足夠的經驗,知道這些步驟都需要的,哪些是剛剛從curft那並不是原來的答案的代碼不適用於您的代碼。

但是,重寫iPhone應用程序以接受在單個消息中包含多個寫入時發送的消息類型可能(也更容易)。

+0

我已經檢查了這兩個頁面,但我找不出要編碼的內容。我在Python中並不強壯,所以如果你能幫助我處理代碼,我們將非常感激。 – Alec

+0

編輯了我的回答,其中包含過程 – Toote

+0

@AlecK。如果你*「在Python中不強壯」*那麼Twisted是**不是**要嘗試使用的框架。即使對於那些在Python中經驗豐富的人來說,它也很複雜也很難正確。 –

2

如果存在相互矛盾的風險,您可能需要重新審查您的應用不存在問題的說法。這聽起來像是你期望完全控制每個傳出TCP數據包的內容,並且你的應用程序是,這取決於數據包邊界以確定消息邊界。這對於一般的網絡來說不是一個很好的方法;一些網絡中介可能會分裂(片段),甚至將數據包組合在一起,這會混淆你的應用。請記住,TCP不是一個數據包協議:它是一個流協議,因此只有確保您發送的八位字節按順序接收(如果有的話)。

處理不同大小的消息的常用方法是在每個消息前加一個X位大端字節大小字段,表明以下消息有多大。通信的接收端首先讀取X位,然後讀取「大小」字節,以獲取完整的消息(阻塞直到該點,並將下一個消息處理程序獲得的任何附加信息留在緩衝區中)。

我不介意用Twisted代碼來幫助更多,但很可能它已經正確寫入了。至少,我建議不要立即嘗試製作Twisted flush網絡寫入緩衝區。雖然它可能會幫助您的代碼看起來正常工作,但現在,它確實會隱藏稍後會出現的問題。

+0

謝謝你不在意幫助我。也許這是我的應用程序,但我強烈地感到它是我的Python。如果你能幫助我,謝謝保羅。 – Alec

+0

在閱讀並理解了上述內容之後,您是否還有一個具體問題? –

+0

問題是如果我發送以「login:」開頭的消息,應用程序會讀取它。但是,如果我進入for循環並進行登錄:那麼包含更多信息的for循環,應用程序不會顯示任何響應。我認爲它可能只是打印而不是發送消息。 – Alec

相關問題