3

由于 Javascript 本身不具备通过原始套接字进行通信的任何功能,因此我决定使用 Java 小程序 - 如果用户在其浏览器上禁用了 Java 小程序,则可以使用 Flash 套接字桥与 Javascript 集成。我尝试过使用jsxmlsockethaxejssocket只是为了面对同样的问题

现在,服务器应用程序是用 Java 编写的,并且可以通过 Java 小程序进行通信。但是在 flash 上,似乎有问题。

flash 收到的第一个文本是对 <policy-file-request/> 的响应,允许访问所有域和端口。这工作正常,因为套接字开始通信

以下是收到数据时运行的 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 小程序等其他客户端中运行良好。

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

4

3 回答 3

1

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

这是一个非常牵强的猜测,但它看起来是这里唯一可能导致该错误的东西

于 2012-05-27T08:53:30.253 回答
0

由于它是网络套接字,我强烈建议您使用 2 "\r" 完成数据。它怎么知道数据流已经完成?

于 2012-05-26T14:50:10.433 回答
0

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

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

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

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

我不知道问题的根源是什么,但这至少应该让魔鬼远离。也许长时间“阻塞”事件处理程序是源头?谁知道?Flash 确实需要异步 ExternalInterface(我很清楚那里有一个解决方案,但它需要额外的 JS 代码,我试图保持清洁)。

于 2012-07-17T12:12:34.930 回答