当前位置:首页 > PHP教程 > php高级应用 > 列表

php实现与erlang的二进制通讯实例解析

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-24 16:27:29 浏览: 评论:0 

这篇文章主要介绍了php实现与erlang的二进制通讯实例解析,需要的朋友可以参考下

一般来说网络通讯常用的方式有2种:文本通讯和二进制通讯。php与erlang之间实现文本通讯比较简单,这里就不做讨论,本文主要讨论的是php与erlang实现二进制通讯的实现方法。实现步骤如下:

erlang端代码:

  1. -module(server). 
  2. -export([start/0]). 
  3. -define( UINT, 32/unsigned-little-integer). 
  4. -define( INT, 32/signed-little-integer). 
  5. -define( USHORT, 16/unsigned-little-integer). 
  6. -define( SHORT, 16/signed-little-integer). 
  7. -define( UBYTE, 8/unsigned-little-integer). 
  8. -define( BYTE, 8/signed-little-integer). 
  9.  
  10. -define( PORT, 5678). 
  11.  
  12. %% 启动服务并接受客户端的连接 
  13. start() -> 
  14.   {ok, LSock} = gen_tcp:listen(?PORT, [binary, {packet, 0},{active, false}]), 
  15.   io:format("socket listen: ~p on ~p ~n",[LSock, ?PORT]), 
  16.   accept(LSock). 
  17.  
  18. accept(LSock) -> 
  19.   {ok, ASock} = gen_tcp:accept(LSock), 
  20.   spawn(fun() -> server_loop(ASock) end), 
  21.   accept(LSock). 
  22.  
  23. server_loop(ASock) -> 
  24.   case gen_tcp:recv(ASock, 0) of 
  25.     {ok, <<Len:?USHORT,Cmd:?USHORT,Contain:4/binary-unit:8>> = A} -> 
  26.       io:format("recv data: ~p ~p ~p~n", [Len, Cmd, Contain]), 
  27.       %%将接收到数据发送回客户端 
  28.       gen_tcp:send(ASock, A), 
  29.       server_loop(ASock); 
  30.     {ok, Data} -> 
  31.       io:format("recv unformated data: ~p~n", [Data]), 
  32.       server_loop(ASock); 
  33.     {error, _} -> 
  34.       {ok, recv_error} 
  35.     end

php端代码:

  1. <?php 
  2.  
  3. $timeout = 3; 
  4. //超时时间:3秒 
  5.  
  6. $fp = fsockopen("tcp://127.0.0.1", 5678, $errno$errstr$timeout/* 连接超时时间 */); 
  7. if (!$fp) { 
  8.  echo "$errstr ($errno)<br />\n"
  9. else { 
  10.  stream_set_timeout($fp$timeout); 
  11.  //远程数据接收或发送超时时间 
  12.  
  13.  $format = "vva4"
  14.  $data = pack($format, 4, 10001, "abcd"); 
  15.  //$data 按照一定格式被打包成二进制数据 
  16.  
  17.  fwrite($fp$data); 
  18.  
  19.  if (!feof($fp)) { 
  20.  
  21.   $rs = fread($fp, 1024); 
  22.   //读取远程数据 
  23.   if ($rs) { 
  24.  
  25.    $len = strlen($rs); 
  26.    //$len 可以获取数据的长度,用以计算content的长度 
  27.    //在这个例子中,content 的长度为 4 
  28.  
  29.    $format = "vlen/vcmd/a4content"
  30.    $data = unpack($format$rs); 
  31.  
  32.    print_r($data); 
  33.   } else { 
  34.    echo "timeout!"
  35.   } 
  36.  } else { 
  37.   echo "timeout!"
  38.  } 
  39.  fclose($fp); 
  40. ?> 

运行正常的情况下,php端会显示以下内容:

Array ( [len] => 4 [cmd] => 10001 [content] => abcd )

针对通讯的一些说明:

这里用到的是php的pack函数和unpack函数:

pack函数:将数据按照一定格式打包成二进制数据,生成的数据接近C/C++的结构体数据(C/C++字符串带结束符)。

unpack函数:与pack相反,对二进制数据进行解包。

对应的erlang端,则直接用位语法来匹配二进制数据即可。

Tags: php二进制通讯 erlang

分享到: