设为首页 收藏本站
查看: 637|回复: 0

[经验分享] 我写的网页游戏框架openjpfgame AMF-PHP通讯部分

[复制链接]

尚未签到

发表于 2017-4-6 12:59:25 | 显示全部楼层 |阅读模式
      最近工作游戏项目比较忙,目前openjpfgame 断断续续开发当中,各个部分之间通讯Flex<--->Java,Flex<--->Php,Php<--->Java都已经开发好。初步确定做一MMORPG游戏Demo版本。
  目前Flex<--->Php通讯方式采用Flash自带的RemoteObject,而经过多次试验使用cairngorm和PureMVC框架对比,我决定Flex本身采用PureMVC框架。PHP本身采用ZendFrame框架,原因很简单,zend出身豪门,强大全面,不愧是Php框架中的战斗机。我把部分Flex以及PHP源码贴出来:
  
  
  图片看不清楚点击放大
DSC0000.png
 
  package org.openjfgame.service
{
 import flash.net.NetConnection;
 import flash.net.Responder;
 import org.openjfgame.event.*;
 import org.openjfgame.utils.*;
  import flash.events.*;
 import org.openjfgame.msg.local.amf.BaseAmfMsg;
 import org.openjfgame.msg.remote.amf.AmfMessage;
 /**
  *
  * @author luodongfu
  *
  */ 
 public class GameNetConnection extends NetConnection
 {
  //php 游戏gameway  对应php:define('WEB_ROOT', 'http://127.0.0.1/openjpfgame/gateway/index');
  private var gateway:String;
  //用户ID
  private var userID:int;
  //会话ID
  private var sessionID:String;
  
  private var _netName:String;
  public function GameNetConnection( netName:String,gateway:String)
  {
   super();
   this.gateway=gateway;
   this._netName=netName;
  //给连接NetConnection监听链接状态并处理
   this.addEventListeneradminNC.addEventListener(NetStatusEvent.NET_STATUS, statusHandler);

  //开始连接PHP
  this.connect(this.gateway);
  }
  
  private function statusHandler(evt:NetStatusEvent):void{
   trace(evt.info.code);
  //根据PHP结果做相应处理
   switch(evt.info.code){
    case "NetConnection.Connect.Rejected":
     var appmsg:String = (evt.info.application == undefined) ? "" : evt.info.application;
    //使用PureMVC通知
     Globals.sendNotification(NotificationConst.CONNECT_AMF_SERVER_REJECTED,appmsg);
     break;
  //使用PureMVC通知
    case "NetConnection.Connect.Failed":
     Globals.sendNotification(NotificationConst.CONNECT_AMF_SERVER_FAIL,evt.info.code);
     break;
  //使用PureMVC通知
    case "NetConnection.Connect.Closed":
     Globals.sendNotification(NotificationConst.CONNECT_AMF_SERVER_CLOSED,evt.info.code);
     break;
  //使用PureMVC通知
    case "NetConnection.Connect.Success":
     Globals.sendNotification(NotificationConst.CONNECT_AMF_SERVER_SUCCESS,evt.info.code);
     break;
   }
  }
  
  //成功接收PHP返回来的信息并通知
  private function onResult(result:Object):void
  {
   var amfMessage:AmfMessage=new AmfMessage();
   amfMessage.copyValue(result);
   switch(amfMessage.result)
   {
    case Constants.REMOTE_SERVICE_RESULT_FAIL:
    case Constants.REMOTE_SERVICE_RESULT_SUCCESS:
     this.dispatchEvent(new JfEvent(amfMessage.remoteMethod,amfMessage.data));
     break;
    default:
    
   }
  }
  //失败发出通知
  private function onFault(result:Object):void
  {
    Globals.sendNotification(NotificationConst.REMOTE_EXCEPTION,result.toString());
  }
  
  //每次发送信息给PHP必须调用这个函数
  public function sendRemoteRequest(remoteMethod:String,bodyMessage:Object):void{
      var remoteMsg:BaseAmfMsg=new BaseAmfMsg(remoteMethod,bodyMessage);
   if(this.userID>0&&this.sessionID.length>0)
   {
    remoteMsg.userID=this.userID;
    remoteMsg.sessionID=this.sessionID;
   }
   this.call(remoteMethod, new Responder(onResult, onFault), remoteMsg);
  }
  
  private function resetUserInfo():void{
   this.userID=-1;
   this.sessionID=null;
  }
  
  public function setUserInfo( userID:int,sessionID:String):void{
   if(userID>0&&sessionID.length>0)
   {
    this.userID=userID;
    this.sessionID=sessionID;
   }
  }
  
  public function get netName():String
  {
   return this._netName;
  }
  }
}
  /**
  *
  * @author luodongfu
  *
  */ 
  package org.openjfgame.msg.remote.amf
{
 import org.openjfgame.msg.BaseMsg;
 
 public class AmfMessage extends BaseMsg
 {
  public var result:int;
  public var exception:String;
  public var data:*;
  public var remoteMethod:String;
  public function AmfMessage()
  {
   super();
  }
 }
}
  PHP zend:
   
  图片看不清楚点击放大
DSC0001.png
 
  index.php
  
  /**
  *
  * @author luodongfu
  *
  */ 
  @header('Content-type:text/html;charset=UTF-8');
 error_reporting(E_ALL|E_STRICT);
 date_default_timezone_set('Asia/Shanghai');
 define('ROOT_DIR', dirname(dirname(__FILE__)));
 define('WEB_ROOT', 'http://127.0.0.1/openjpfgame/');
 define('CACHE_DIR', 'C:/cache');
    define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
    define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
 define('GAME_SERVICE_PATH', APPLICATION_PATH . './application/game');
    set_include_path('.'.PATH_SEPARATOR.'./library'.PATH_SEPARATOR.'./application/models/'.PATH_SEPARATOR.'./application/game/'.PATH_SEPARATOR.get_include_path());

   
  require('Zend/Loader/Autoloader.php');
    Zend_Loader_Autoloader::getInstance()->registerNamespace('Zend_');

  $config=new Zend_Config_Ini('./application/config/config.ini',null, true);
 Zend_Registry::set('config',$config);
 $dbAdapter=Zend_Db::factory($config->general->db->adapter,$config->general->db->config->toArray());
.........................................

  ...........................................
   
   
  /**
  *
  * @author luodongfu
  *
  */ 
  GatewayController .php
  //所有游戏请求都在这里处理
  class GatewayController extends Zend_Controller_Action
{
    public function init()
    {
  $this->getHelper('ViewRenderer')->setNoRender();
       
    }
    public function serviceAction()
    {
     echo Zend_Amf_Server_Factory::getInstance()->handle();
    }
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-361120-1-1.html 上篇帖子: PHP接收GET中文参数乱码解决方法 下篇帖子: PHP str_replace()和str_ireplace()区别与解释
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表