闪存套接字无法正确读取 Java 服务器



由于Javascript本身没有任何通过原始套接字进行通信的功能,我决定使用Java小程序 - 如果用户在他的浏览器上禁用了java小程序,则与Javascript集成的flash套接字桥。我已经尝试过jsxmlsocket和haxejssocket,只是面对同样的问题

现在,服务器应用程序是用Java编写的,并且通过java小程序进行通信可以正常工作。但是在闪光灯上,似乎有问题。

闪存收到的第一个文本是对<策略文件请求 />的响应,允许访问所有域和端口。这工作正常,因为套接字开始通信

以下是接收数据时运行的 Javascript 代码:

socket.onData = function(data) {
    alert(data);
    parse(data);
}

现在,问题来了。发送对<策略文件请求 />的响应后,还会发送 5 行文本。当然,预期的是我会看到 5 个带有发送文本的警报框。事实似乎并非如此。相反,我看到的是 5 个警报框,其中包含对的响应。看起来好像有什么东西被发送了,因为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+""; //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结尾。也许这是负责任的?

注意:我想在这里强调,我熟悉 websocket 以及它们如何"更合适",所以请不要建议这样做。

前所述,它在其他客户端(如Telnet和Java小程序(中工作正常。

更新:不,这不是这个问题的重复。我的问题与脚本仅在每次onData调用时返回对<policy-file-request/>的响应有关。在此过程中没有抛出"错误"。

据我所知,这看起来像是某种内部兼容性问题。你的代码看起来很好,所以这意味着代码和运行它的软件版本之间一定存在某种不兼容,从而导致问题。

这是一个相当牵强的猜测,但它看起来是唯一可能真正导致该错误的东西

由于它是 Web 套接字,我强烈建议您使用 2 个"\r"完成数据。它还如何知道数据流已完成?

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

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

我正在使用Flash XMLSocket和ExternalInterface to Javascript。如果我有一个与从 Flash 同步调用的 javascript 代码相关联的警报,并且我没有立即单击它,我将一遍又一遍地收到相同的响应,即使我知道我发送了不同的响应(我的 C# 服务器在调试模式下将所有内容输出到控制台(。

我发现绕过它的唯一方法是保证您的事件处理程序执行得非常快(就像将消息添加到div 一样(,或者如果您可以构建一些 que 系统,可以排列所有消息并一个接一个地同步调用它们。

我不知道问题的根源是什么,但这至少应该让魔鬼远离。也许长时间"阻止"事件处理程序是源?谁知道呢?Flash确实需要异步外部接口(我很清楚那里的解决方案,但它需要额外的JS代码,我正在努力保持干净(。

最新更新