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截取中文字符串的问题
Jul 12 PHP
PHP获得用户使用的代理服务器ip即真实ip
Dec 31 PHP
用PHP实现的生成静态HTML速度快类库
Mar 31 PHP
php UTF-8、Unicode和BOM问题
May 18 PHP
PHP开发规范手册之PHP代码规范详解
Jan 13 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
Nov 01 PHP
简单实现限定phpmyadmin访问ip的方法
Mar 05 PHP
php简单图像创建入门实例
Jun 10 PHP
php中文乱码问题的终极解决方案汇总
Aug 01 PHP
PHP实现git部署的方法教程
Dec 19 PHP
PHP抽象类和接口用法实例详解
Jul 20 PHP
Laravel 错误提示本地化的实现
Oct 22 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使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
2020/08/10 Javascript
python从ftp下载数据保存实例
2013/11/20 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
Python中的__init__作用是什么
2020/06/09 Python
Python 列表反转显示的四种方法
2020/11/16 Python
css3一个简易的 LED 数字时钟实现方法
2020/01/15 HTML / CSS
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
行政人员工作职责
2013/12/05 职场文书
企业为何需要商业计划书
2013/12/26 职场文书
生产厂长岗位职责
2014/02/21 职场文书
《九色鹿》教学反思
2014/02/27 职场文书
2014年基层党组织公开承诺书
2014/03/29 职场文书
党员四风剖析材料
2014/08/27 职场文书
交警失职检讨书
2015/01/26 职场文书
幼师小班个人总结
2015/02/12 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
电影建党伟业观后感
2015/06/01 职场文书
教师读书笔记
2015/06/29 职场文书
小学远程教育工作总结
2015/08/13 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js