由于 Javascript 本身不具备通过原始套接字进行通信的任何功能,因此我决定使用 Java 小程序 - 如果用户在其浏览器上禁用了 Java 小程序,则可以使用 Flash 套接字桥与 Javascript 集成。我尝试过使用jsxmlsocket和haxejssocket只是为了面对同样的问题
现在,服务器应用程序是用 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
调用只返回响应的脚本有关。过程中没有抛出“错误”。