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程序防止ddos,dns,集群服务器攻击的解决办法
Jun 18 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
Aug 07 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
Apr 08 PHP
smarty简单分页的实现方法
Oct 27 PHP
PHP中上传多个文件的表单设计例子
Nov 19 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
php metaphone()函数及php localeconv() 函数实例解析
May 15 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
May 30 PHP
PHP实现统计在线人数功能示例
Oct 15 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
Feb 17 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
PHP批斗大会之缺失的异常详解
Jul 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中的string类型使用说明
2010/07/27 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
jquery tools 系列 scrollable学习
2009/09/06 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
详解AngularJS中module模块的导入导出
2015/12/10 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
Python中itertools模块用法详解
2014/09/25 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
Python列表推导式与生成器表达式用法示例
2018/02/08 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
保护环境倡议书100字
2014/05/19 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
安全承诺书
2015/01/19 职场文书
护士节慰问信
2015/02/15 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
高三化学教学反思
2016/02/22 职场文书
如何利用js在两个html窗口间通信
2021/04/27 Javascript
MySQL常见优化方案汇总
2022/01/18 MySQL
Sql Server之数据类型详解
2022/02/28 SQL Server