php获取js变量:document.write(string);
$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变量:
//------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="[email protected]"; } echo ‘strings=name=‘.$name.‘<br/>‘; echo ‘pasd=‘.$pasd.‘<br/>‘; echo ‘mail=‘.$mail.‘<br/>‘; echo ‘sign=‘.$sign.‘<br/>‘;
as3.0获取后台数据必须以后台输出的键值对的明文来获取。
php获取AS3.0变量:
/* *@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。
phpMyAdmin中设置主键和A_I:在新建数据表里面其实就可以设置A_I,但是好像并没有找到设置主键的钥匙按钮,后来才发现是我的数据里面的[结构]那一栏不知道为什么总是打不开,偶然打开了一次,设置主键的按钮在这一栏中,真是害得我好苦。然后就是不知道怎么处理数据插入失败后再次插入成功的时候主键增长的时候回将失败的次数也计算在里面,最后我在php端直接将失败的的操作该屏蔽掉了才解决了这个问题,但我想应该有更好的办法吧。
二.服务器端:
游戏服务器其实是我借用别人的,只是在基础上根据自己需要修改了一些。
1.swf客户端连接到服务端:相信swf客户端连接到服务端好多人都很头疼,我在好几个flash群里面遇到过好多关于安全沙箱问题,以及socket连接。其实只要安全策略文件配置正确一般都没有问题,还有会提示打开843端口的情况,是本地默认关闭这个端口造成的。在 本地防火墙->高级设置->进站规则->新建规则 里面可以添加自己允许的端口号。
as3.0 socket连接到java服务端:
//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();