ActionScript 3.0套接字无法重新连接
连接超时后,我无法通过Socket和XMLSocket类连接到TCP侦听器。
我有一个Flash applet,它需要维持与服务器的TCP连接。我已经使用计时器,乒乓球系统等实现了超时。但是,有一个问题。调用Socket.connect()时,Flash Player(9.0.115和之前的许多其他稳定器)会通过SYN数据包发送3个连接请求,之间有一段时间。如果没有任何响应(例如,由于服务器已关闭),我将无法使applet [尝试]连接到服务器。曾经。也就是说,在applet的生存期内。
澄清和/或者总结:
对于分配给Socket.connect()或者XMLSocket.connect()的任何主机/端口对,如果调用失败,则在Flash小程序的生存期内,对任何其他Socket(或者XMLSocket)实例的任何后续connect()调用都将相同。主机/端口对被忽略。 (至少据我所知,使用包嗅探器。)
我已经尝试过使用Sockets池调用许多Socket方法,destroyment1和重新创建对象,以及我现在不记得的各种其他方法。一切都无济于事。
我当前的解决方案是通过JavaScript调用通知父网页,并让其重新加载我的applet。这不是一个很好的解决方案,并且我不会因为Flash不能正确处理套接字连接而针对它引起的问题实施变通方法。
我一定会错过一些非常简单的东西。
有任何想法吗?
1:我知道你不能真正摧毁物体;我只是删除所有对它们的引用,并希望最好。在这种情况下,我没有尝试显式调用GC。 (尽管我认为我确实尝试过将Socket放入数组中并使用delete。)
是的,如果连接成功(即使以后断开连接),它也可以按预期工作。
当服务器根本不响应时,触发此事件的唯一事件是:好像Flash将主机/端口组合标记为"脱机",并且在applet的整个生命周期内都不会再向其发送任何数据包。
我怀疑主动拒绝连接(例如主机在线但未监听端口)不会导致这种情况。
我没有从套接字收到任何错误消息或者任何其他类型的反馈。
当第一个失败时,我们是否曾经多次对同一主机/端口对调用connect()?
我们怎么知道第一个connect()失败了?在随后的connect()调用之前,我们是否进行了任何操作来重置套接字?
解决方案
回答
这可能与未解决的错误FP-269有关,而错误FP-269的根本原因可能与FP-67相同。
This build should be fixed in the current public beta release found on labs.adobe.com Edwin Wong - [09/23/08 04:49 PM ]
我建议我们尝试一下最新的公开测试版...