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&amp;java(二)
Oct 09 PHP
php开发文档 会员收费1期
Aug 14 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
Dec 18 PHP
微信公众平台实现获取用户OpenID的方法
Apr 15 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
Jun 06 PHP
基于PHP微信红包的算法探讨
Jul 21 PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 PHP
php 5.4 全新的代码复用Trait详解
Jan 05 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
PHP校验15位和18位身份证号的类封装
Nov 07 PHP
yii框架数据库关联查询操作示例
Oct 14 PHP
Laravel 实现添加多语言提示信息
Oct 25 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强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
在vs2010中调试javascript代码方法
2011/02/11 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
jQuery消息提示框插件Tipso
2015/05/04 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
AngularJS入门教程之表单校验用法示例
2016/11/02 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
Pytorch的mean和std调查实例
2020/01/02 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
COSETTE官网:奢华,每天
2020/03/22 全球购物
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
银行工作检查书范文
2014/01/31 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
安全教育的主题班会
2015/08/13 职场文书
Mysql 设置boolean类型的操作
2021/06/04 MySQL
Go归并排序算法的实现方法
2022/04/06 Golang