论坛首页 综合技术论坛

PHP和Erlang服务器通信基于协议{packet,N}

浏览 12950 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-12   最后修改:2009-08-12
要点是 pack 和 unpack 函数
Erlang使用{packet,N}后,会自动在数据前面增加N为 16进制数据,代表接下来的数据长度
AS里面也有类似功能
PHP没有直接的方法,需要自己封装包头信息,和解包
(感谢 mryufeng 的提示,将fgets 改成 fread)

<?php
$host   ="114.80.88.*";
$port   =5101;
$fp = stream_socket_client("tcp://$host:$port", $errno, $errstr, 2);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    stream_set_timeout($fp,2);
    get_line($fp);
    
    put_line($fp,"SYSMSG,bobo,Hi boy");
    
    fclose($fp);
}
function get_line($handle){
    while(!feof($handle)){
        $buff       =fread($handle,2); //获得长度信息
        $head       =unpack("H*",$buff);
        return fread($handle,hexdec($head[1]));
    }
}
function put_line($handle,$data){
    $body	=pack("A*",$data);   //将数据打包
    $len	=strlen($body);
    $head	=pack("H*",to_hex_str($len));
    fwrite($handle,$head.$body);
}
function to_hex_str($num){ //将十进制长度转换成16进制,并且补0
    $str    =dechex($num);
    $str    =str_repeat('0',4-strlen($str)).$str;
    return $str;
}
?>
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics