繼續以前的德州撲克話題,上次的DOS界面確實無法看,我女友說這是什麼鬼。哈哈,估計只有本身能玩了html
這兩天重構了一下界面,基於web服務器和瀏覽器來交互。前端
服務器和客戶端之間用websocket通訊,這種全雙工長鏈接更方便服務器及時的將整個遊戲數據向客戶端推送。git
這篇隨筆主要記錄一下作前端界面的時候遇到的一些坑,至於德州撲克遊戲的具體邏輯以及AI的邏輯能夠查看我前兩篇隨筆github
說道web服務器,go語言對這方面封裝的很是好,用起來太爽了。而使用websocket,咱們須要用到google提供的一個websocket包。web
下載地址:http://code.google.com/p/go.net/websocketchrome
若是訪問不了的話,能夠從這個地址下載:https://github.com/SongLiangChen/websocket(我本身下好,打包在github上)跨域
整個重構很是簡單,架設一個web服務器,客戶端和服務器之間創建websocket鏈接,服務器首先將初始化的遊戲數據打包成XML推送給客戶端,客戶端經過JavaScript解析以後將數據展現。以後服務器根據遊戲邏輯來等待客戶端輸入數據,例以下注之類。而後進行下一步計算,而且從新將數據推送給客戶端展示。瀏覽器
過程當中主要遇到的坑就是JavaScript解析XML的時候,因爲各個瀏覽器之間的不一樣而致使不少兼容性的問題。服務器
好比chrome不容許跨域訪問,同時它又沒有實現像IE相似的loadXml()或者load()函數。因此只能經過http請求向服務器索要數據。websocket
function loadXMLStr(xmlFile){ try{ xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); }catch(e){ xmlDoc=document.implementation.createDocument("","",null); } try{ xmlDoc.async=false; xmlDoc.loadXML(xmlFile); }catch(e){ var xmlhttp = new window.XMLHttpRequest(); xmlhttp.overrideMimeType("text/xml; charset=utf-8"); xmlhttp.open("GET","xml",false); xmlhttp.send(); xmlDoc = xmlhttp.responseXML; } return xmlDoc; };
代碼中紅色標註的那句話,它的做用是標註請求的數據是一種xml文本資源,而且能夠通知服務器瀏覽器使用的編碼方式。若是沒有的話,你將會發現responseText可以正確返回數據,可是responseXML將返回NULL。
如今咱們chrome中運行這段JS代碼, 服務器就會收到一個"xml"(名字能夠本身定)的請求。咱們只要設置一下路由,收到"xml"請求的時候,將數據發送給客戶端就能夠啦
func GetXml(w http.ResponseWriter, r *http.Request){ fmt.Println("getXml ",string(desk.GetXmlData())) w.Write(desk.GetXmlData()) } func main(){ http.Handle("/con", websocket.Handler(StartGame)) http.HandleFunc("/", Hello) http.HandleFunc("/xml", GetXml) if err := http.ListenAndServe(":8080", nil); err != nil{ fmt.Println("LS Fail") } }
在go語言中,這種事情都不是事情,你能夠看到,真的至關簡單。
運行服務器,瀏覽器經過8080端口訪問本地就能夠玩耍啦
代碼開源在github上,歡迎交流:https://github.com/SongLiangChen/AITexasHoldemForWeb
運行時候請將html文件和exe文件放在同一個目錄下