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(/&/, "&").replace(/</, "<").
replace(/>/, ">").replace(/"/, """); // "
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