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 相关文章推荐
PHP与javascript的两种交互方式
Oct 09 PHP
header()函数使用说明
Nov 23 PHP
php 生成静态页面的办法与实现代码详细版
Feb 15 PHP
PHP禁止页面缓存的代码
Oct 23 PHP
php对二维数组进行排序的简单实例
Dec 19 PHP
解决php接收shell返回的结果中文乱码问题
Jan 23 PHP
php中spl_autoload详解
Oct 17 PHP
初识ThinkPHP控制器
Apr 07 PHP
PHP清除缓存的几种方法总结
Sep 12 PHP
PHP序列化的四种实现方法与横向对比
Nov 29 PHP
PHP让网站移动访问更加友好方法
Feb 14 PHP
在Laravel中实现使用AJAX动态刷新部分页面
Oct 15 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 Global定义全局变量使用说明
2013/08/15 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
深入解析Python中的lambda表达式的用法
2015/08/28 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
Python 字典中的所有方法及用法
2020/06/10 Python
python中关于数据类型的学习笔记
2020/07/19 Python
python实现移动木板小游戏
2020/10/09 Python
我的网上商城创业计划书
2013/12/26 职场文书
生产部主管岗位职责
2014/01/06 职场文书
面试后感谢信
2014/02/01 职场文书
员工拓展培训方案
2014/02/15 职场文书
物理学专业自荐信
2014/06/11 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
大学运动会加油稿
2015/07/22 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
python字典进行运算原理及实例分享
2021/08/02 Python
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android