2012-05-20 30 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

相关问题