实现websocket兼容ie6-10

解决方案:

    使用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

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值