[英]flash socket not reading from Java Server properly
由于Javascript本身没有任何功能可以通过原始套接字进行通信,所以我决定使用Java applet - 并且在用户已经在其浏览器上禁用了Java applet的事件中,一个闪存套接字桥将与Javascript集成。 我尝试过jsxmlsocket以及haxejssocket只是为了面对同样的问题
现在,服务器应用程序是用Java编写的,并且通信在java applet上运行良好。 但在闪存上,似乎存在问题。
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;
}
}
};
要发送数据,调用send函数:
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/>
的响应有关。 该过程中没有抛出“错误”。
从我所看到的,这看起来像某种内部兼容性问题。 您的代码似乎很好,因此这意味着代码与运行它的软件版本之间必然存在某种不兼容性,从而导致问题。
这是一个相当遥远的猜测,但它看起来像这里唯一可能导致错误
由于它是网络套接字,我强烈建议您使用2“\\ r”完成数据。 它怎么知道数据流完成了?
尝试构建Flash聊天时遇到同样的问题。
我相信这是一个Flash相关的问题,如果事件处理程序运行的时间太长,那么它就会混乱并一遍又一遍地读取相同的消息。
我正在使用带有ExternalInterface的Flash XMLSocket到Javascript。 如果我有一个警告与从Flash同步调用的javascript代码绑定,我不会立即点击它,我会一遍又一遍地得到相同的响应,即使我知道我已经发送了不同的响应(我的C#服务器)在调试模式下将所有内容输出到控制台。
我找到它的唯一方法是保证你的事件处理程序执行得非常快(就像将消息添加到div中),或者如果你可以构建一些可以排队所有消息并一个接一个地调用它们的que系统同步。
我不知道问题的根源是什么,但这至少应该让魔鬼远离。 也许长时间“阻止”事件处理程序是源? 谁知道? Flash真的需要异步的ExternalInterface(我很清楚那里有一个解决方案,但它需要额外的JS代码,而我正试图保持清洁)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.