用golang解決 Flash AS3 的 socket 安全策略文件問題

代碼如下:

</pre><pre>package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"time"
)

const (
	Head = 4
)

var (
	ClientMap map[int]net.Conn = make(map[int]net.Conn)
)

func main() {
	fmt.Println(os.Args[0])
	ip_port := "127.0.0.1:843"
	if len(os.Args) > 1 {
		ip_port = os.Args[1]
	}
	fmt.Println(
		"\nFlash AS 策略服務運行中...\n自動迴應SocketXml端口(即843端口)的crossdomain.xml請求\n如需指定ip和端口,可以在程序啓動時指定參數,格式如下\ngameserver843.exe 192.168.101.139:843",
		"\n當前正在偵聽", ip_port,
		"\n請不要關閉此窗口...")
	tcpAddr, err := net.ResolveTCPAddr("tcp4", ip_port)
	checkError(err)
	listener, err := net.ListenTCP("tcp", tcpAddr)
	checkError(err)
	clientIndex := 0

	for {
		clientIndex++
		conn, err := listener.Accept()
		if err != nil {
			continue
		}
		go handleClient(conn, clientIndex)
	}
}

func handleClient(conn net.Conn, index int) {
	ClientMap[index] = conn

	fmt.Println("")
	fmt.Println("=======================")
	fmt.Println("新用戶連接, 來自: ", conn.RemoteAddr(), "index: ", index)
	fc := func() {
		time.Sleep(time.Second) //給客戶端1秒的響應的時間,否則客戶端有可能讀不到數據就提前Close了
		conn.Close()
		delete(ClientMap, index)
		fmt.Println("移除序號爲: ", index, "的客戶端,斷開客戶端的連接")
		fmt.Println("=======================")
	}
	defer fc()
	sendFirstMsg(conn)
}
func sendFirstMsg(conn net.Conn) {
	str := `<?xml version="1.0"?>
			<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
			<cross-domain-policy>
				<site-control permitted-cross-domain-policies="master-only"/>
				<allow-access-from domain="*" to-ports="*" />
			</cross-domain-policy>`
	writer := bufio.NewWriter(conn)
	writer.WriteString(str)
	writer.Flush()
	fmt.Println("已經迴應策略文件:crossdomain.xml")
}
func checkError(err error) {
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(1)
	}
}


裝好golang環境,然後直接 go run main.go 就行了。

當然,也可以直接下載我編譯好的 exe 可執行文件。

下載頁面如下:

https://github.com/moketao/XmlSocket_843

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