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

来源:互联网 发布:jrnl java 编辑:程序博客网 时间:2024/05/18 09:57

在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通信同样适用。


原创粉丝点击