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为SHOPEX增加日志功能代码
Jul 02 PHP
PHP中的integer类型使用分析
Jul 27 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
php使用fputcsv()函数csv文件读写数据的方法
Jan 06 PHP
php经典算法集锦
Nov 14 PHP
WordPress后台中实现图片上传功能的实例讲解
Jan 11 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
yii2中的rules 自定义验证规则详解
Apr 19 PHP
php微信开发之自定义菜单完整流程
Oct 08 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
Jun 06 PHP
php生出随机字符串
Jul 06 PHP
PHP替换Word中变量并导出PDF图片的实现方法
Nov 26 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四舍五入、取整、round函数使用示例
2015/02/06 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
JavaScript学习笔记之Function对象
2015/01/22 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
基于Python fminunc 的替代方法
2020/02/29 Python
python中pow函数用法及功能说明
2020/12/04 Python
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
法国购买二手电子产品网站:Asgoodasnew
2020/03/27 全球购物
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
班队活动设计方案
2014/01/30 职场文书
文员求职信
2014/07/15 职场文书
网聊搭讪开场白
2015/05/28 职场文书
银行工作心得体会范文
2016/01/23 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js