Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 扭曲套接字立即发送消息_Python_Twisted - Fatal编程技术网

Python 扭曲套接字立即发送消息

Python 扭曲套接字立即发送消息,python,twisted,Python,Twisted,我正在制作一个iPhone应用程序,它可以与一个扭曲的插座进行通信,当我有一条消息要发送时,它工作得非常好。然而,我的问题是我需要向应用程序发送许多不同的信息。这是我的密码 if numrows == 1: #Did login msg = "%s: Login Credentials Success" % _UDID print msg for

我正在制作一个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)
假设我只发送第一条消息,而其他每一条消息都不与打印一起存在,对于每条消息下面的方法,登录凭据成功消息将发送到应用程序。但是如果像你所看到的那样把其余的放进去,什么也不会发生,因为它一次发送所有的信息,即使在代码中加上time.sleep

应用程序每隔0.05秒或更短时间检查一次响应。即使登录凭据位于顶部,它也不会通过,因为之后会发送更多的信息,但是如果没有凭据消息之后的所有信息,它会通过

我急切地想找到这个问题的答案。我已经尝试了我能想到的一切。应用程序不是问题所在,而是Python


谢谢。

您的问题似乎是写入其中的数据被扭曲缓冲

显然,在不重构大量代码的情况下,要强制自己发送数据是不容易的。见和

在粘贴剪贴之前不知道代码是什么样子的,根据最后一个链接的公认答案:

  • 定义
    wait
    函数,就像在接受的答案中一样
  • 确保您的类继承自
    http.Request
  • defer.inlineCallbacks
  • 在调用
    message
    方法上的
    write
    之后添加
    屈服等待(N)
    (对于必须测试和确定的N值)
我在Twisted方面没有足够的经验,无法知道哪些步骤是必需的,哪些只是从原始答案的代码中提取出来的,而这些代码不适用于您的代码


不过,重新编写iPhone应用程序以接受在一条消息中包含多次写入时发送的消息类型可能是可能的(而且更容易)。

如果您的应用程序没有问题,您可能会有被反驳的风险,您可能需要重新检查这一说法。听起来您希望能够完全控制每个传出TCP数据包的内容,并且您的应用程序依赖数据包边界来确定消息边界。一般来说,这不是一个很好的人际网络方法;一些网络中介可能会在传输过程中分裂(分割)甚至合并数据包,这会混淆您的应用程序。请记住,TCP不是一个数据包协议:它是一个流协议,因此您只能真正保证您发送的八位字节将按顺序接收(如果有的话)

处理大小不同的消息的一种常见方法是在每条消息的前面加上一个X位big-endian size字段,说明下面的消息有多大。通信的接收端首先读取X位,然后读取“大小”八位字节以获取完整消息(阻塞到该点,并在缓冲区中留下任何附加信息供下一个消息处理程序获取)


我不介意在你的扭曲代码上提供更多帮助,但很可能它已经被正确地编写了。至少,我建议不要依赖于立即创建Twisted flush网络写入缓冲区。虽然它可能有助于使代码看起来正常工作,但现在,它实际上只是隐藏了稍后将出现的问题。

我已经检查了这两个页面,但我不知道该编写什么代码。我不擅长Python,所以如果您能帮助我编写代码,我将不胜感激。@AlecK。如果您“不擅长Python”,那么Twisted就不是您要尝试使用的框架。即使对于那些非常有Python经验的人来说,这也很复杂,很难得到正确的答案。这是一个非常有用的答案。请注意,您的类不必从http.Request继承。等待函数、装饰器和收益语句的定义是必要的。谢谢你不介意帮助我。也许它是我的应用程序,但我强烈地感觉到它是我的Python。如果你能帮助我,谢谢paul。在阅读并理解了以上内容后,你还有什么问题吗?问题是如果我发送一条以“login:”开头的消息,应用程序就会阅读它。但是,如果我进入for循环并登录:那么包含更多信息的for循环,应用程序不会显示任何响应。我想它可能只是打印而根本不发送消息。我不清楚“do login:”或“for loop containing more information”的确切含义。也许为你的应用程序的另一端发布一些(简化的)代码会有帮助吗?我无法访问python或应用程序,因为它在我的另一台计算机上的另一个城市。套接字向应用程序发送“Login:UDID_HERE;successful”以显示登录成功。它工作正常,但当我添加其他要发送的东西(例如for循环)时,它不会发送,即使是在睡眠时间。我可以在这个周末给你一些代码。不要在Twisted reactor线程中使用time.sleep(或任何阻塞函数)。@Jean-PaulCalderone我用它来测试它,但它不起作用。我发帖子后发现没有使用time.sleep()。