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 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
php str_pad 函数用法简介
Jul 11 PHP
用php实现的下载css文件中的图片的代码
Feb 08 PHP
ionCube 一款类似zend的PHP加密/解密工具
Jul 25 PHP
批量去除PHP文件中bom的PHP代码
Mar 13 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
Aug 09 PHP
php中session与cookie的比较
Jan 27 PHP
浅谈PHP Cookie处理函数
Jun 10 PHP
PHP文件上传操作实例详解
Sep 27 PHP
PHP自定义序列化接口Serializable用法分析
Dec 29 PHP
PHP常用字符串函数小结(推荐)
Aug 05 PHP
基于laravel belongsTo使用详解
Oct 18 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
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
php 多线程上下文中安全写文件实现代码
2009/12/28 PHP
php 地区分类排序算法
2013/07/01 PHP
php中引用符号(&amp;)的使用详解
2013/11/13 PHP
php读取大文件示例分享(文件操作类)
2014/04/13 PHP
常用PHP框架功能对照表
2014/10/23 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
解决echarts数据二次渲染不成功的问题
2020/07/20 Javascript
解读python如何实现决策树算法
2018/10/11 Python
python如何实现DES加密
2020/09/21 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
python实现ping命令小程序
2020/12/28 Python
python 批量将中文名转换为拼音
2021/02/07 Python
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
大学三年的自我评价
2013/12/25 职场文书
《乌塔》教学反思
2014/02/17 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
大学生求职计划书
2014/04/30 职场文书
团队队名口号大全
2014/06/06 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
在人间读书笔记
2015/06/30 职场文书
商业计划书格式、范文
2019/03/21 职场文书
教你用python实现12306余票查询
2021/06/30 Python