[Erlang]erlang与php的通信

网络通讯常用的有2种:文本通讯和二进制通讯。php与erlang之间文本通讯比较简单,这里不做讨论,主要讨论php与erlang实现二进制通讯。

通讯示例

erlang端代码:

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

php端代码:

[php]  view plain copy
  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. }  
  41. ?>  

正常情况下php端会显示以下内容:

[plain]  view plain copy
  1. Array ( [len] => 4 [cmd] => 10001 [content] => abcd )  

通讯说明

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

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

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

而erlang端,直接用位语法来匹配二进制数据即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值