扭曲套接字立即发送消息

2022-04-18 00:00:00 python twisted

问题描述

我正在制作一个与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秒或更短时间检查一次响应。即使登录凭据在顶部,它也不会通过,因为之后会发送更多信息,但凭据消息之后没有所有信息,它也会通过。

我急于找到这个问题的答案。我已经试过我能想到的一切了。问题不在这个应用程序,而是这个巨蟒。

谢谢。


解决方案

冒着抵触冒犯的风险,您可能需要重新检查您的应用程序不是问题所在的说法。这听起来像是您希望完全控制每个传出的TCP包的内容,并且您的应用程序是根据包边界来确定消息边界。总的来说,这不是一种很好的联网方法;一些网络中介可能会在此过程中拆分(碎片)甚至合并数据包,这会使您的应用程序感到困惑。请记住,tcp不是数据包协议:它是流协议,因此您只能真正保证您发送的八位字节将按顺序接收(如果有的话)。

处理不同大小的消息的一种常见方法是在每个消息前加上一个X位大端大小字段,说明下一条消息有多大。通信的接收端首先读取X位,然后再读取‘SIZE’二进制八位数以获得完整的消息(在此之前一直阻塞,并在缓冲区中保留任何附加信息以供下一个消息处理程序获取)。

我不介意为您的Twisted代码提供更多帮助,但很可能它已经正确编写了。至少,我建议不要依赖于尝试让Twisted立即刷新网络写入缓冲区。虽然它可能会帮助您的代码看起来正常工作,但现在,它实际上只是隐藏了以后会浮出水面的问题。

相关文章