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


Posted in PHP onJuly 23, 2014

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

erlang端代码:

-module(server).

-export([start/0]).
-define( UINT, 32/unsigned-little-integer).

-define( INT, 32/signed-little-integer).

-define( USHORT, 16/unsigned-little-integer).

-define( SHORT, 16/signed-little-integer).

-define( UBYTE, 8/unsigned-little-integer).

-define( BYTE, 8/signed-little-integer).
-define( PORT, 5678).
%% 启动服务并接受客户端的连接

start() ->

  {ok, LSock} = gen_tcp:listen(?PORT, [binary, {packet, 0},{active, false}]),

  io:format("socket listen: ~p on ~p ~n",[LSock, ?PORT]),

  accept(LSock).
accept(LSock) ->

  {ok, ASock} = gen_tcp:accept(LSock),

  spawn(fun() -> server_loop(ASock) end),

  accept(LSock).
server_loop(ASock) ->

  case gen_tcp:recv(ASock, 0) of

    {ok, <<Len:?USHORT,Cmd:?USHORT,Contain:4/binary-unit:8>> = A} ->

      io:format("recv data: ~p ~p ~p~n", [Len, Cmd, Contain]),

      %%将接收到数据发送回客户端

      gen_tcp:send(ASock, A),

      server_loop(ASock);

    {ok, Data} ->

      io:format("recv unformated data: ~p~n", [Data]),

      server_loop(ASock);

    {error, _} ->

      {ok, recv_error}

    end.

php端代码:

<?php

$timeout = 3;
//超时时间:3秒

$fp = fsockopen("tcp://127.0.0.1", 5678, $errno, $errstr, $timeout/* 连接超时时间 */);
if (!$fp) {
 echo "$errstr ($errno)<br />\n";
} else {
 stream_set_timeout($fp, $timeout);
 //远程数据接收或发送超时时间

 $format = "vva4";
 $data = pack($format, 4, 10001, "abcd");
 //$data 按照一定格式被打包成二进制数据

 fwrite($fp, $data);

 if (!feof($fp)) {

  $rs = fread($fp, 1024);
  //读取远程数据
  if ($rs) {

   $len = strlen($rs);
   //$len 可以获取数据的长度,用以计算content的长度
   //在这个例子中,content 的长度为 4

   $format = "vlen/vcmd/a4content";
   $data = unpack($format, $rs);

   print_r($data);
  } else {
   echo "timeout!";
  }
 } else {
  echo "timeout!";
 }
 fclose($fp);
}
?>

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

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

针对通讯的一些说明

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

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

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

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

PHP 相关文章推荐
PHPMailer邮件类利用smtp.163.com发送邮件方法
Sep 11 PHP
php遍历所有文件及文件夹的方法深入解析
Jun 08 PHP
thinkphp的c方法使用示例
Feb 24 PHP
Codeigniter操作数据库表的优化写法总结
Jun 12 PHP
PHP函数实现分页含文本分页和数字分页
Oct 23 PHP
php实现发送微信模板消息的方法
Mar 07 PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 PHP
php设计模式之单例模式代码
Jun 11 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
PHP实现的日历功能示例
Sep 01 PHP
PDO::rollBack讲解
Jan 29 PHP
Yii框架函数简单用法分析
Sep 09 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 #PHP
Yii使用CLinkPager分页实例详解
Jul 23 #PHP
ThinkPHP单字母函数(快捷方法)使用总结
Jul 23 #PHP
PHP中的use关键字概述
Jul 23 #PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 #PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
Jul 22 #PHP
ThinkPHP权限认证Auth实例详解
Jul 22 #PHP
You might like
用PHP制作的意见反馈表源码
2007/03/11 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
Python三级目录展示的实现方法
2016/09/28 Python
python如何读写json数据
2018/03/21 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
python 自定义装饰器实例详解
2019/07/20 Python
Django的CVB实例详解
2020/02/10 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
军校大学生个人的自我评价
2014/02/17 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
安全宣传标语口号
2014/06/06 职场文书
文秘应届生求职信
2014/07/05 职场文书
创先争优个人承诺书
2014/08/30 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
承诺书怎么写 ?
2019/04/16 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
python 解决微分方程的操作(数值解法)
2021/05/26 Python
手把手教你怎么用Python实现zip文件密码的破解
2021/05/27 Python