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 相关文章推荐
Content-type 的说明
Oct 09 PHP
php之CodeIgniter学习笔记
Jun 17 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
PHP中source #N问题的解决方法
Jan 27 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
ThinkPHP模板比较标签用法详解
Jun 30 PHP
php实现读取内存顺序号
Mar 29 PHP
PHP自定义函数获取汉字首字母的方法
Dec 01 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
用php如何解决大文件分片上传问题
Jul 07 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实现多级树型菜单
2006/10/09 PHP
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
php 什么是PEAR?(第三篇)
2009/03/19 PHP
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
JS 实现点击a标签的时候让其背景更换
2013/10/15 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
2015/09/10 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
基于jquery编写分页插件
2016/03/07 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
Javascript操作select控件代码实例
2020/02/14 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
python下os模块强大的重命名方法renames详解
2017/03/07 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
python flask实现分页效果
2017/06/27 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
机关作风建设心得体会
2014/10/22 职场文书
晚自修旷课检讨书怎么写
2014/11/17 职场文书
民事代理词范文
2015/05/25 职场文书
教师年度考核自我评鉴
2015/08/11 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技