由于Javascript本身没有任何功能来直接通信,我决定使用一个Java applet,并在用户禁用Java applet时,与Javascript集成一个Flash socket桥。我尝试过jsxmlsocket和haxejssocket,但遇到了相同的问题。
现在,服务器应用程序是用Java编写的,通过Java applet进行通信工作正常。但在Flash上似乎存在问题。
Flash收到的第一条文本是对的响应,允许访问所有域和端口。这很好,因为套接字开始通信。
以下是当数据被接收时运行的Javascript代码:
现在,问题来了。发送<policy-file-request/>的响应后,还会发送5行文本。当然期望的是我会看到5个带有发送文本的警报框。 但事实并非如此。我看到的是5个带有<policy-file-request/>响应的警报框。似乎有东西被发送了,因为OnData函数似乎在正确的时间触发,但由于某种原因,数据似乎是发送给它的第一行文本。
负责发送数据的Java线程:
如您所见,所有发送的数据都以空字节或 \0 结尾。也许这是原因?
注意:我想强调一下,我熟悉 WebSockets 及其“更加适合”的用法,所以请不要建议使用它。
如前所述,在其他客户端(如 Telnet 和 Java applet)中运行良好。
更新:不,这不是此问题的重复。我的问题与脚本仅在每个 onData 调用时返回对
现在,服务器应用程序是用Java编写的,通过Java applet进行通信工作正常。但在Flash上似乎存在问题。
Flash收到的第一条文本是对的响应,允许访问所有域和端口。这很好,因为套接字开始通信。
以下是当数据被接收时运行的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 applet)中运行良好。
更新:不,这不是此问题的重复。我的问题与脚本仅在每个 onData 调用时返回对
<policy-file-request/>
的响应有关。在此过程中没有抛出“错误”。