扭曲套接字立即发送消息
问题描述
我正在制作一个与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立即刷新网络写入缓冲区。虽然它可能会帮助您的代码看起来正常工作,但现在,它实际上只是隐藏了以后会浮出水面的问题。
相关文章