PHP XML Socket编程 服务端接收到多个连续xml等错误的解决办法

在PHP + FLASH 游戏的编程中,经常碰到需要PHP使用Socket 和Flash 的XMLsocket 进行交互。

PHP的在处理socket客户端发送过来的数据时,会有以下四种情况:

1、正常数据,如:

<data><items><item>1</item><item>2</item></items></data>


 

2、密集的多条数据(是通过一次TCP过程),如:

<data><items><item>1</item><item>2</item></items></data><data><items><item>1</item><item>2</item></items></data>


 

3、超长的数据分多次发送,如:

1)

<data><items><item>1</item>

2)

<item>2</item><item>32</item

3)

></items></data>

 

4、错误的数据,如:非xml数据,不完整的xml数据等。

 

分割线

下面是本人在项目中使用的解决办法:

<?php
//...为省略代码

//....

  $bytes = socket_recv($socket, $buffer, 4096, 0);

 // CLIENT HAS SENT DATA
$this->parseRequest($socket, $buffer);

 //...

   /**
     * 处理收到的XML请求
     */
private function parseRequest($socket, $data) {

try {

          //情况2

           $xmlNum = substr_count($data,"\0");
            if($xmlNum){
                $xmls = explode("\0",$data);//多条并行的socket数据之间会用\0分割
                foreach($xmls as $xml_data){
                    $this->parseRequest($socket, $xml_data);
                }
                return;
            }

//正常的处理代码 情况1

//...

}catch(Exception $e) {//错误的xml处理(情况3和4),由于多个xml并行发送情况,不会产生错误,所以不会转到这里处理。
            if($this->xmlData) {//
                if($this->xmlData !=($this->xmlData.$data)) {
                    $this->xmlData .= $data;
                    $this->parseRequest($socket, $this->xmlData);
                }
            }
            $this->xmlData = $data;//失败则记录
        }

}

 
?>


这几个错误的处理方式,不限于xml socket 其他的socket通信同样适用。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值