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