【问题标题】:flash socket not reading from Java Server properlyflash socket 没有从 Java Server 正确读取
【发布时间】:2012-05-18 14:50:22
【问题描述】:

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

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

flash 收到的第一个文本是对 的响应,允许访问所有域和端口。这很好用,因为套接字开始通信

这是接收数据时运行的 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+"\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 小程序等其他客户端中运行良好。

更新:不,这不是 this question 的副本。我的问题与在每次 onData 调用时仅返回对 &lt;policy-file-request/&gt; 的响应有关的脚本有关。过程中没有抛出“错误”。

【问题讨论】:

  • 这是图书馆的一部分。如果您希望查看该代码,请转到顶部这两个链接之一上的那些链接。问题说 flash 是因为 flash 处理通信,而不是我编写了 flash 代码或知道如何
  • 如前所述,两者似乎都有我上面描述的相同问题。而且由于两者都给出了同样的问题,我认为这是我的 javascript 或 java 出了问题,而不是 flash 本身,因为其他人似乎在使用这些库时没有任何问题
  • 是的,所以我们回到我原来的问题:为什么它不起作用呢? Java似乎做得对,因为它与其他客户端一起工作,所以js或flash肯定有问题。或者甚至可能是行尾,因为我听说闪存在每行结束时的套接字有问题,
  • 等一下,我现在不在家。我到家后第一件事就试试。
  • 我格式化了脚本以匹配其余代码的上下文,但 JS 似乎给出了一些错误。我对 JS 不是很擅长,所以我不能自己调试它

标签: java javascript flash sockets


【解决方案1】:

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

这是一个相当牵强的猜测,但它似乎是这里唯一可能导致该错误的原因

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好的,我稍后会尝试,但在我这样做之前,我想明确一点,这不使用 websockets。看起来你没有正确阅读我的问题的结尾
    • 哦,那也没用。它仍然有同样的问题。一样的。对于您的问题 - “它如何知道数据流已完成?”好吧,如果您阅读了我上面的代码,那么您就会知道每一行都以空字节或 /0 结尾。我也试过 /r/n 和只是 /n ,但它仍然有同样的问题
    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 哈哈是的。这似乎与发生在我身上的事情一样。
    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多