在连接超时后,我无法(通过 Socket 和 XMLSocket 类)连接到 TCP 侦听器。
我有一个需要维护与服务器的 TCP 连接的 flash 小程序。我已经使用计时器、乒乓球系统等实现了超时。但是,有一个问题。在调用 Socket.connect() 时,flash 播放器(9.0.115 和之前的许多其他马厩)通过 SYN 数据包发送 3 个连接请求,中间有一段时间。如果这些都没有得到回复(例如,因为服务器已关闭),我无法让小程序[尝试] 连接到服务器。曾经。也就是说,在小程序的生命周期内。
澄清和/或总结:
对于提供给 Socket.connect() 或 XMLSocket.connect() 的任何主机/端口对,如果调用失败,则在 Flash 小程序的生命周期内对任何其他 Socket(或 XMLSocket)实例的任何后续 connect() 调用都将主机/端口对被忽略。(至少据我所知,使用数据包嗅探器。)
我尝试过调用许多 Socket 方法、销毁和重新创建对象、使用 Socket 池以及我现在不记得的各种其他方法;一切都无济于事。
我目前的解决方案是通过 JavaScript 调用通知父网页并让它重新加载我的小程序。这不是一个很好的解决方案,我也不打算针对它引起的问题实施解决方法,只是因为 Flash 无法正确处理套接字连接。
我一定错过了一些非常简单的东西。
有任何想法吗?
1:我知道你不能真正摧毁物体;我只是删除了对它们的所有引用并希望最好。在这种情况下,我没有尝试显式调用 GC。(尽管我认为我确实尝试将 Socket 放入 Array 并使用delete。)
是的,如果连接成功,它会按预期工作(即使稍后连接断开。)
触发这种情况的唯一事件是服务器根本没有响应的情况;就好像 Flash 将主机/端口组合标记为“离线”,并且在小程序的生命周期内不再向其发送任何数据包。
我怀疑主动拒绝连接(例如主机在线但未监听端口)不会导致这种情况。
我没有从 Socket 收到任何错误消息或任何其他类型的反馈。
当第一个失败时,您是否曾经多次调用 connect() 到同一个主机/端口对?你怎么知道第一个 connect() 失败了?在随后的 connect() 调用之前,你有没有做任何事情来重置套接字?