解决方案:
使用FlashSocket
问题:
由于新版的Flash在建立Socket连接之前,会向服务器索要策略文件,所以需要在服务器开启一个返回策略文件的服务,这里使用java来跑这个服务
下面贴代码(就一个java类,跑一下main方法即可,这里直接将策略文件内容直接以字符串的形式发出):
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SecurityXMLServer implements Runnable {
private ServerSocket server;
private BufferedReader reader;
private BufferedWriter writer;
private String xml;
public SecurityXMLServer() {
/**
注意此处xml文件的内容,为纯字符串,没有xml文档的版本号
*/
xml = "<cross-domain-policy> "
+"<allow-access-from domain=\"*\" to-ports=\"80\"/>"
// +"<allow-access-from domain=\"*\" to-ports=\"1-9999\"/>"
+"</cross-domain-policy>\0";//最后一定要加上 \0
// System.out.println("policyfile文件路径: " + path);
System.out.println(xml);
//启动843端口
createServerSocket(843);
new Thread(this).start();
}
//启动服务器
private void createServerSocket(int port) {
try {
server = new ServerSocket(port);
System.out.println("服务监听端口:" + port);
} catch (IOException e) {
System.exit(1);
}
}
//启动服务器线程
public void run() {
while (true) {
Socket client = null;
try {
//接收客户端的连接
client = server.accept();
InputStreamReader input = new InputStreamReader(client.getInputStream(), "UTF-8");
reader = new BufferedReader(input);
OutputStreamWriter output = new OutputStreamWriter(client.getOutputStream(), "UTF-8");
writer = new BufferedWriter(output);
//读取客户端发送的数据
StringBuilder data = new StringBuilder();
int c = 0;
while ((c = reader.read()) != -1)
{
if (c != '\0')
data.append((char) c);
else
break;
}
String info = data.toString();
System.out.println("输入的请求: " + info);
//接收到客户端的请求之后,将策略文件发送出去
if(info.indexOf("<policy-file-request/>") >=0) {
writer.write(xml);
writer.flush();
System.out.println("将安全策略文件发送至: " + client.getInetAddress());
}
else{
writer.write("请求无法识别/0");
writer.flush();
System.out.println("请求无法识别: "+client.getInetAddress());
}
client.close();
} catch (Exception e) {
e.printStackTrace();
try {
//发现异常关闭连接
if (client != null) {
client.close();
client = null;
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
//调用垃圾收集方法
System.gc();
}
}
}
}
//测试主函数
public static void main(String[] args){
new SecurityXMLServer();
}
}
这里说一下,实现这个返回策略文件有很多方式,以上只是其中一种
这里有详细介绍:https://blog.csdn.net/jackliang55/article/details/5978055
前端的demo:https://github.com/gimite/web-socket-js
下载下来之后,解压,修改一个websocket服务的地址,最好将项目放到tomcat中,访问http://<ip>:<port>/.../sample.html