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 相关文章推荐
ftp类(example.php)
Oct 09 PHP
如何利用php+mysql保存和输出文件
Oct 09 PHP
信用卡效验程序
Oct 09 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
PHP数组交集的优化代码分析
Mar 06 PHP
php 解决旧系统 查出所有数据分页的类
Aug 27 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
Jan 11 PHP
PHP扩展Memcache分布式部署方案
Dec 06 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
May 11 PHP
php源码的安装方法和实例
Sep 26 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 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排序算法(冒泡排序,快速排序)
2012/10/09 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
2013/04/26 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
PHP根据IP地址获取所在城市具体实现
2013/11/27 PHP
php编写简单的文章发布程序
2015/06/18 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
js实现简单的日历显示效果函数示例
2019/11/25 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
python list 合并连接字符串的方法
2013/03/09 Python
详解Python中的strftime()方法的使用
2015/05/22 Python
python机器学习实战之K均值聚类
2017/12/20 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
python 公共方法汇总解析
2019/09/16 Python
详解python中docx库的安装过程
2019/11/08 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
python global和nonlocal用法解析
2020/02/03 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
办公文员的工作岗位职责
2013/11/12 职场文书
大学毕业感言一句话
2014/02/06 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
护士节慰问信
2015/02/15 职场文书
教师网络培训心得体会
2016/01/09 职场文书
Golang 实现WebSockets
2022/04/24 Golang