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 相关文章推荐
第七节 类的静态成员 [7]
Oct 09 PHP
Content-type 的说明
Oct 09 PHP
php smarty模版引擎中的缓存应用
Dec 11 PHP
PHP与javascript实现变量交互的示例代码
Jul 23 PHP
实现获取http内容的php函数分享
Feb 16 PHP
ThinkPHP单字母函数(快捷方法)使用总结
Jul 23 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
php创建session的方法实例详解
Jan 27 PHP
PHP使用array_fill定义多维数组的方法
Mar 18 PHP
图文详解PHP环境搭建教程
Jul 16 PHP
POST一个JSON格式的数据给Restful服务实例详解
Apr 07 PHP
PHP反射原理与用法深入分析
Sep 28 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
根德YB400的电路分析
2021/03/02 无线电
PHP IF ELSE简化/三元一次式的使用
2011/08/22 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
jquery 滚动条事件简单实例
2013/07/12 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
细说Vue组件的服务器端渲染的过程
2019/05/30 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
美国高端医师级美容产品电商:BeautifiedYou.com
2017/04/17 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
北京某公司的.net笔试题
2014/03/20 面试题
中层干部竞争上岗演讲稿
2014/01/13 职场文书
新护士岗前培训制度
2014/02/02 职场文书
我爱我校演讲稿
2014/05/21 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
保安2014年终工作总结
2014/12/06 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
投诉信回复范文
2015/07/03 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
一个成功的互联网创业项目,必须满足这些要求
2019/08/23 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js