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