websocket兼容低版本IE

flash發起socket通信的三個過程

當封裝在頁面的flash發起socket通信請求的時候會先尋找服務器端的843端口,獲取Crossdomain.xml文件,當服務器沒有開啓 843的時候,flashPlayer會檢查發起請求的swf文件中中有沒有使用Security.loadPolicyFile來加載策略文件 Crossdomain.xml,如果還是沒有就會看這個發起請求的swf要連接的目標端口有沒有策略文件。

<html><head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>Sample of web_socket.js</title>
  
  <!-- Include these three JS files: -->
  <script type="text/javascript" src="js/swfobject.js"></script>
  <script type="text/javascript" src="js/web_socket.js"></script>

  <script type="text/javascript">
    
    // Set URL of your WebSocketMain.swf here:
    WEB_SOCKET_SWF_LOCATION = "WebSocketMain.swf";
    // Set this to dump debug message from Flash to console.log:
    WEB_SOCKET_DEBUG = true;
    
    // Everything below is the same as using standard WebSocket.
    
    var ws;
    
    function init() {
      // Connect to Web Socket.
      // Change host/port here to your own Web Socket server.
      ws = new WebSocket("ws://localhost:9000/websocket/web");

      // Set event handlers.
      ws.onopen = function() {
        output("onopen");
      };
      ws.onmessage = function(e) {
        // e.data contains received string.
        output("onmessage: " + e.data);
      };
      ws.onclose = function() {
        output("onclose");
      };
      ws.onerror = function() {
        output("onerror");
      };

    }
    
    function onSubmit() {
      var input = document.getElementById("input");
      // You can send message to the Web Socket using ws.send.
      ws.send(input.value);
      output("send: " + input.value);
      input.value = "";
      input.focus();
    }
    
    function onCloseClick() {
      ws.close();
    }
    
    function output(str) {
      var log = document.getElementById("log");
      var escaped = str.replace(/&/, "&amp;").replace(/</, "&lt;").
        replace(/>/, "&gt;").replace(/"/, "&quot;"); // "
      log.innerHTML = escaped + "<br>" + log.innerHTML;
    }

  </script>
</head><body "init();">
  <form "onSubmit(); return false;">
    <input type="text" id="input">
    <input type="submit" value="Send">
    <button "onCloseClick(); return false;">close</button>
  </form>
  <div id="log"></div>
</body></html>

獲取策略文件的Java服務器端代碼

package org.david.server.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Project server
 * @Author David.Lee
 * @Date 2019/4/3 11:07
 * @Description
 */
public class SecurityXMLServer implements Runnable {

    private static Logger logger = LoggerFactory.getLogger(SecurityXMLServer.class);

    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=\"1025-9999\"/>"
                +"</cross-domain-policy> ";

        //啓動843端口
        createServerSocket(843);
        new Thread(this).start();
    }

    //啓動服務器
    private void createServerSocket(int port)
    {
        try {
            server = new ServerSocket(port);
            logger.info("服務監聽端口:{}", 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();
                //接收到客戶端的請求之後,將策略文件發送出去
                if(info.indexOf("<policy-file-request/>") >=0)
                {
                    writer.write(xml + "\0");
                    writer.flush();
                    logger.info("將安全策略文件發送至: {}", client.getInetAddress());
                }
                else
                {
                    writer.write("請求無法識別\0");
                    writer.flush();
                    logger.info("請求無法識別: {}", 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://pan.baidu.com/s/19po_pm4j4CEFHbiASfamUQ
提取碼:nwe6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章