由于Javascript本身没有任何通过原始套接字进行通信的功能,我决定使用Java小程序 - 如果用户在他的浏览器上禁用了java小程序,则与Javascript集成的flash套接字桥。我已经尝试过jsxmlsocket和haxejssocket,只是面对同样的问题
现在,服务器应用程序是用Java编写的,并且通过java小程序进行通信可以正常工作。但是在闪光灯上,似乎有问题。
闪存收到的第一个文本是对<策略文件请求 />的响应,允许访问所有域和端口。这工作正常,因为套接字开始通信
以下是接收数据时运行的 Javascript 代码:
socket.onData = function(data) {
alert(data);
parse(data);
}
现在,问题来了。发送对<策略文件请求 />的响应后,还会发送 5 行文本。当然,预期的是我会看到 5 个带有发送文本的警报框。事实似乎并非如此。相反,我看到的是 5 个警报框,其中包含对
负责发送数据的 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代码,我正在努力保持干净(。