Flash Socket无法从Java服务器正常读取数据

3
由于Javascript本身没有任何功能来直接通信,我决定使用一个Java applet,并在用户禁用Java applet时,与Javascript集成一个Flash socket桥。我尝试过jsxmlsockethaxejssocket,但遇到了相同的问题。
现在,服务器应用程序是用Java编写的,通过Java applet进行通信工作正常。但在Flash上似乎存在问题。
Flash收到的第一条文本是对的响应,允许访问所有域和端口。这很好,因为套接字开始通信。
以下是当数据被接收时运行的Javascript代码:
socket.onData = function(data) {
    alert(data);
    parse(data);
}

现在,问题来了。发送<policy-file-request/>的响应后,还会发送5行文本。当然期望的是我会看到5个带有发送文本的警报框。 但事实并非如此。我看到的是5个带有<policy-file-request/>响应的警报框。似乎有东西被发送了,因为OnData函数似乎在正确的时间触发,但由于某种原因,数据似乎是发送给它的第一行文本。
负责发送数据的Java线程:
LinkedBlockingQueue<String> outQueue=new LinkedBlockingQueue<String>(1000);
public Thread checkSendLoop=new Thread(){ //this is done to cramp everything in one file. Also more neater
    public void run(){
        try{
            OutputStream out=socket.getOutputStream();
            while (true){
                String mes=outQueue.take();
                mes=mes.replace("\n", "").replace("\r", ""); //for safety
                mes=mes+"\0"; //append
                out.write(mes.getBytes());
                out.flush();
            }
        }
        catch (Exception e){
            System.out.println("FATAL : Data to a client will not be sent anymore."); //probably a socket close threw the exception
            outQueue.clear();
            outQueue=null;
        }
    }
};

要发送数据,需要调用发送函数:

public void send(String s){
    Queue<String> testQueue = outQueue;
    s=s+" "+getUnixTime();
    if (testQueue!=null){
        System.out.println("SENDING "+nick+" - "+s);
        testQueue.add(s); //just add to the queue , the check loop will make sure that its sent
    }
}

如您所见,所有发送的数据都以空字节或 \0 结尾。也许这是原因?
注意:我想强调一下,我熟悉 WebSockets 及其“更加适合”的用法,所以请不要建议使用它。
如前所述,在其他客户端(如 Telnet 和 Java applet)中运行良好。
更新:不,这不是此问题的重复。我的问题与脚本仅在每个 onData 调用时返回对 <policy-file-request/> 的响应有关。在此过程中没有抛出“错误”。

这是库的一部分。如果您想查看该代码,则请转到顶部的两个链接中的其中一个链接。问题之所以提到Flash,是因为Flash处理通信,而不是我编写了Flash代码或知道如何编写Flash代码。 - EnKrypt
如前所述,两者似乎都有我上面描述的同样问题。由于两者都出现了相同的问题,我认为这可能是我的JavaScript或Java出了问题,而不是Flash本身,因为其他人使用这些库时似乎没有任何问题。 - EnKrypt
是的,完全正确。因此,我们回到了我的最初的问题:为什么它不起作用呢?Java似乎做得很对,因为它可以与其他客户端一起工作,所以可能是js或flash出了问题。或者甚至可能是行尾符的问题,因为我听说flash在处理套接字时会遇到行尾符的问题。 - EnKrypt
可能是为什么Flash Player在这种情况下会抛出沙盒错误?的重复问题。 - Paul Sweatte
不,绝对不是这样的。请不要滥用您的权力,因为读取它们两个的内容并正确判断它们是否相似是一项艰巨的任务。我更加坚信这一点,因为这两个问题都没有得到令人满意的答案,所以您不能声称已经通过自己的经验和修补注意到了这两个问题都在解决同一个问题。 - EnKrypt
显示剩余2条评论
3个回答

1
从我所看到的,这似乎是某种内部兼容性问题。你的代码看起来没问题,这意味着代码和运行它的软件版本之间存在某种不兼容性,从而导致了问题。
这只是一个猜测,但看起来这是唯一可能引起错误的因素。

0

由于这是Web套接字,我强烈建议您在数据末尾添加2个“\r”。 否则它怎么知道数据流已经结束呢?


好的,我一会儿会尝试这样做,但在此之前,我想要明确一点,这并没有使用Websockets。看起来你没有仔细阅读我的问题的结尾。 - EnKrypt
哦,还有那个方法也不行。它仍然存在同样的问题。非常相似。至于你的问题 - “它怎么知道数据流何时结束?”好吧,如果你已经阅读了我上面的代码,那么你就会知道每一行都以空字节或/0结尾。我也尝试过/r/n和只用/n,但它仍然存在同样的问题。 - EnKrypt

0

我在尝试构建Flash聊天时遇到了同样的问题。

我相信这是一个与Flash相关的问题,如果事件处理程序运行时间过长,那么它会出现混乱并一遍又一遍地读取相同的消息。

我正在使用Flash XMLSocket与ExternalInterface到Javascript。如果我将警报绑定到从Flash同步调用的javascript代码,并且我不立即点击它,即使我知道我已发送不同的响应(我的C#服务器在Debug模式下输出所有内容到控制台),我也会一遍又一遍地收到相同的响应。

我找到的唯一解决方法是保证您的事件处理程序执行非常快(就像将消息添加到div中一样),或者如果您可以构建一些队列系统,可以将所有消息排队并依次同步调用它们。

我不知道问题的根源,但至少这可以让魔鬼远离。也许长时间“阻塞”事件处理程序才是问题的根源?谁知道呢?Flash确实需要异步ExternalInterface(我很清楚有一个解决方案,但它需要额外的JS代码,而我正在努力避免这种情况)。


哈哈,是的。这似乎就是我遇到的同样问题。 - EnKrypt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接