php獲取js變量:document.write(string);javascript
$name=" <script type='text/javascript'> document.write(getName()); function getName(){ var str=window.location.search; var args=str.split('?'); var retval=''; if(args[0]==str){return '';}//參數爲空; return args[1].split('=')[1]; } </script>"; //其實這樣是獲得了變量,但也實際上是一個囉嗦,能夠直接用$_GET['KEY']獲得。
AS3.0獲取php變量:php
//------signClass------- //加載目標php文件函數: private function loaded(event:Event):void { if(this.data.strings) { var str:String=this.data.strings; var arr=this.data.strings.split("<br/>"); trace(arr[0].split("name=")[1]); trace(arr[1].split("pasd=")[1]); trace(arr[2].split("mail=")[1]); trace(arr[3].split("sign=")[1]); if(arr[3].split("sign=")[1]=="succeed") { this.isSign=true; info=Singleton.GetSingleton(UserInfo as Class); info.user_pswd=arr[1].split("pasd=")[1]; info.userEmail=arr[2].split("mail=")[1]; info.userName =arr[0].split("name=")[1]; this.father.SIGNED=this.father.STATES["succeed"]; }else if(arr[3].split("sign=")[1]=="faild"){ trace("運行到此處"); this.isSign=false; this.father.SIGNED=this.father.STATES["faild"]; }else { trace("unormal"); this.father.SIGNED=this.father.STATES["error"]; } } //trace(this.isSign); }
$sql="SELECT * FROM chinesechess WHERE user_email='{$_email}'and password='{$_paswd}' and isActivated='{$_activate}'"; $result = mysql_query($sql,$con); $source=mysql_fetch_array($result); if($source) { $sign="succeed"; $name=$source['nickname']; $pasd=$source['password']; $mail=$source['user_email']; }else { $sign="faild"; $name="null"; $pasd="null"; $mail="null@cn.com"; } echo 'strings=name='.$name.'<br/>'; echo 'pasd='.$pasd.'<br/>'; echo 'mail='.$mail.'<br/>'; echo 'sign='.$sign.'<br/>';
as3.0獲取後臺數據必須之後臺輸出的鍵值對的明文來獲取。java
php獲取AS3.0變量:mysql
/* *@function : public signClass 構造函數 *@parameter: * path String php文件路徑 * obj Main Main類 * email String 郵件字符串 "NULL" * password String 密碼字符串 "1234" */ public function signClass(path:String,obj:Sign_mc,email:String="NULL",password:String="1234") { this.father=obj; _var=new URLVariables(); request=new URLRequest(path); request.method=URLRequestMethod.POST; _var._email=email; _var._pasd=password; request.data=_var; this.dataFormat = URLLoaderDataFormat.VARIABLES; this.load(request); this.addEventListener(Event.COMPLETE,loaded); //trace(password); }
AS3.0客戶端經過 URLVariables對象就值以URLRequest的method=URLRequestMethod.POST方法發送給php,php端直接使用$_POST['_email']獲取到就OK。sql
phpMyAdmin中設置主鍵和A_I:在新建數據表裏面其實就能夠設置A_I,可是好像並無找到設置主鍵的鑰匙按鈕,後來才發現是個人數據裏面的[結構]那一欄不知道爲何老是打不開,偶然打開了一次,設置主鍵的按鈕在這一欄中,真是害得我好苦。而後就是不知道怎麼處理數據插入失敗後再次插入成功的時候主鍵增加的時候回將失敗的次數也計算在裏面,最後我在php端直接將失敗的的操做該屏蔽掉了才解決了這個問題,但我想應該有更好的辦法吧。安全
二.服務器端:服務器
遊戲服務器實際上是我借用別人的,只是在基礎上根據本身須要修改了一些。網絡
1.swf客戶端鏈接到服務端:相信swf客戶端鏈接到服務端好多人都很頭疼,我在好幾個flash羣裏面遇到過好多關於安全沙箱問題,以及socket鏈接。其實只要安全策略文件配置正確通常都沒有問題,還有會提示打開843端口的狀況,是本地默認關閉這個端口形成的。在 本地防火牆->高級設置->進站規則->新建規則 裏面能夠添加本身容許的端口號。dom
as3.0 socket鏈接到java服務端:socket
//ServerThread .java package com.feiruo.Chess; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class ServerThread extends Thread { Server father; boolean tag=true; String xmlString="<cross-domain-policy>"; ServerSocket ss; public ServerThread(Server server) { this.father=server; this.ss=father.ss; this.xmlString="<?xml version=\"1.0\"?>" + "<!DOCTYPE cross-domain-policy SYSTEM \"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\">" + "<cross-domain-policy>" + "<allow-access-from domain=\"*\" to-ports=\"8082\" />" + "</cross-domain-policy>\0"; } public void run() { while (this.tag) { try { //等待鏈接: Socket sc=ss.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream())); PrintWriter pw = new PrintWriter(sc.getOutputStream()); char[] by = new char[22]; br.read(by,0,22); String msghead = new String(by); // System.out.println(msghead); if (msghead.startsWith("<policy-file-request/>")) { pw.print(this.xmlString); pw.flush(); } else { //開啓代理線程 ServerAgentThread sat=new ServerAgentThread(this.father, sc); // System.out.println("已發送"); sat.start(); sat.dou.writeUTF("<#CONNECTED#>"); sat.dou.flush(); sat.tag=true; // System.out.println("IP:"+sc.getInetAddress()); } } catch (Exception e) { this.tag=false; } } } }
檢測客戶端是否斷開鏈接:
//檢測出客戶端是否斷網或者離線 try { sc.sendUrgentData(0); } catch (IOException e) { this.client_leave("<#CLIENT_LEAVE#>"+this.getName()); tag=false;//終止該服務器代理線程 }
sendUrgentData方法會往輸出流發送一個字節的數據,只要對方Socket的SO_OOBINLINE屬性沒有打開,就會自動捨棄這個字節,而SO_OOBINLINE屬性默認狀況下就是關閉的。
AS3.0使用setTimeout判斷socket鏈接超時:
private var isResponsed:Boolean=false; ...... setTimeoutHandlerId=setTimeout( function():void { if(!isResponsed) { this.ERROR="網絡鏈接超時,\n請從新嘗試!"; } },timeoutMs); this.addEventListener(Event.CONNECT,haveConnected); ...... private function setReponsedHandler(event:Event):void { isResponsed=true; clearTimeout(setTimeoutHandlerId); } ...... public function haveConnected(event:Event):void { clearTimeout(setTimeoutHandlerId); this.flush(); }
2.數據傳送:
AS3.0讀取服務器數據:這裏可能遇到的問題就是讀取數據遇到文件尾。起初我使用的是Socket.readUTFBytes(Socket.bytesAvailable);可是會發現讀取的數據是讀取完了,可是在給臨時變量賦值的時候字符串是斷斷續續的,以致於後面對數據的分析和判斷不怎麼好進行操做。我也先把數據存起來等它所有讀完以後再合併以後進行分析操做,可是感受這樣好繁瑣。最後選用了Socket.readUTF()方法,可是會有遇到文件尾問題,因而本身也百度了許多,但看到的方法感受並不怎麼適合本身,最後我想既然是遇到文件尾,確定是我對數據發送時處理的不恰當,最後發現我在java客戶端發送數據以後都沒有清空的緣由。真表示馬虎。DataOutputStream.flush();