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脚本
Nov 26 PHP
UCenter Home二次开发指南
May 28 PHP
php数据库连接时容易出错的特殊符号问题
Sep 01 PHP
php开发环境配置记录
Jan 14 PHP
基于PHP一些十分严重的缺陷详解
Jun 03 PHP
PHP中获取时间的下一周下个月的方法
Mar 18 PHP
PHP 正则表达式常用函数
Aug 17 PHP
PHP中比较时间大小实例
Aug 21 PHP
PHP间隔一段时间执行代码的方法
Dec 02 PHP
php根据年月获取当月天数及日期数组的方法
Nov 30 PHP
Laravel框架自定义验证过程实例分析
Feb 01 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 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启动时候提示PHP startup的解决方法
2013/05/07 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
javascript常见数据验证插件大全
2015/08/03 Javascript
JavaScript图像延迟加载库Echo.js
2016/04/05 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
js前端导出Excel的方法
2017/11/01 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
原生js实现照片墙效果
2020/10/13 Javascript
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
简单介绍Python中的floor()方法
2015/05/15 Python
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
Python实现的knn算法示例
2018/06/14 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
世界上最大的专业美容用品零售商:Sally Beauty
2017/07/02 全球购物
前台文员岗位职责及工作流程
2013/11/19 职场文书
公司会计岗位职责
2014/02/13 职场文书
无私奉献演讲稿
2014/09/04 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
演讲开头怎么书写?
2019/08/06 职场文书