一般来说网络通讯经常使用的方式有2种:文本通讯和二进制通讯。

php与erlang之间实现文本通讯比較简单。这里就不做讨论,本文主要讨论的是php与erlang实现二进制通讯的实现方法。实现过程例如以下:

erlang端代码:

  1. -module(server).
  2. -export([start/0]).
  3.  
  4. -define( UINT, 32/unsigned-little-integer).
  5.  
  6. -define( INT, 32/signed-little-integer).
  7.  
  8. -define( USHORT, 16/unsigned-little-integer).
  9.  
  10. -define( SHORT, 16/signed-little-integer).
  11.  
  12. -define( UBYTE, 8/unsigned-little-integer).
  13.  
  14. -define( BYTE, 8/signed-little-integer).
  15.  
  16. -define( PORT, 5678).
  17.  
  18. %% 启动服务并接受client的连接
  19.  
  20. start() ->
  21.  
  22. {ok, LSock} = gen_tcp:listen(?PORT, [binary, {packet, 0},{active, false}]),
  23.  
  24. io:format("socket listen: ~p on ~p ~n",[LSock, ?PORT]),
  25.  
  26. accept(LSock).
  27.  
  28. accept(LSock) ->
  29.  
  30. {ok, ASock} = gen_tcp:accept(LSock),
  31.  
  32. spawn(fun() -> server_loop(ASock) end),
  33.  
  34. accept(LSock).
  35.  
  36. server_loop(ASock) ->
  37.  
  38. case gen_tcp:recv(ASock, 0) of
  39.  
  40. {ok, <<Len:?USHORT,Cmd:?USHORT,Contain:4/binary-unit:8>> = A} ->
  41.  
  42. io:format("recv data: ~p ~p ~p~n", [Len, Cmd, Contain]),
  43.  
  44. %%将接收到数据发送回client
  45.  
  46. gen_tcp:send(ASock, A),
  47.  
  48. server_loop(ASock);
  49.  
  50. {ok, Data} ->
  51.  
  52. io:format("recv unformated data: ~p~n", [Data]),
  53.  
  54. server_loop(ASock);
  55.  
  56. {error, _} ->
  57.  
  58. {ok, recv_error}
  59.  
  60. end.

php端代码:

  1. <?php
  2. $timeout = 3;
  3. //超时时间:3秒
  4. $fp = fsockopen("tcp://127.0.0.1", 5678, $errno, $errstr, $timeout/* 连接超时时间 */);
  5. if (!$fp) {
  6. echo "$errstr ($errno)<br />n";
  7. } else {
  8. stream_set_timeout($fp, $timeout);
  9. //远程数据接收或发送超时时间
  10. $format = "vva4";
  11. $data = pack($format, 4, 10001, "abcd");
  12. //$data 依照一定格式被打包成二进制数据
  13. fwrite($fp, $data);
  14. if (!feof($fp)) {
  15. $rs = fread($fp, 1024);
  16. //读取远程数据
  17. if ($rs) {
  18. $len = strlen($rs);
  19. //$len 能够获取数据的长度。用以计算content的长度
  20. //在这个样例中,content 的长度为 4
  21. $format = "vlen/vcmd/a4content";
  22. $data = unpack($format, $rs);
  23. print_r($data);
  24. } else {
  25. echo "timeout!";
  26. }
  27. } else {
  28. echo "timeout!";
  29. }
  30. fclose($fp);
  31. }
  32. ?
  33. >

执行正常的情况下,php端会显示下面内容:

  1. Array ( [len] => 4 [cmd] => 10001 [content] => abcd )

针对通讯的一些说明

这里用到的是php的pack函数和unpack函数:

pack函数:将数据依照一定格式打包成二进制数据。生成的数据接近C/C++的结构体数据(C/C++字符串带结束符)。

unpack函数:与pack相反。对二进制数据进行解包。

相应的erlang端。则直接用位语法来匹配二进制数据就可以。

PHP 5.3新增魔术方法__invoke概述
PHP自从5.3版以来就新增了一个叫做__invoke的魔术方法,使用该方法就能够在创建实例后。直接调用对象。

例如以下演示样例所看到的:classtestClass{publicfunction__invoke{prin

PHP结合JQueryJcrop实现图片裁切实例具体解释
我们经常能够看到一些站点上有图片剪切的功能,也许你会认为这一功能炫目华丽。神奇莫測!

可是今天介绍的一款专用于图片裁切的插件jquery.Jcrop.min.

PHP实现依据设备类型自己主动跳转相应页面的方法
随着当今移动设备的普及,上网已经比过去更加方便。针对Android智能手机,iPhone/iPad等移动终端,非常多站点都相继推出了针对电脑和这类手机等移动设

Php与Erlang的Socket通信的更多相关文章

  1. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  2. erlang的Socket参数含义

    http://blog.csdn.net/pkutao/article/details/8572216 {ok, Listen} = gen_tcp:listen(?defPort, [binary, ...

  3. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  4. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  5. Socket通信类

    package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

  6. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  7. socket通信

    socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...

  8. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  9. .NET开源高性能Socket通信中间件Helios介绍及演示

    一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...

随机推荐

  1. SlickSafe.NET 开源权限框架开发指南

    前言:本文适用于快速搭建权限系统的用户,尤其适用于希望有良好定义的权限模型建立:系统解决方案是在基于角色访问控制(RBAC)策略基础上的权限访问模型实现,主要完成了后台权限验证逻辑和前端权限数据验证的 ...

  2. JS对象与PHP对象的对比

    一.对象的创建与访问 1.JS对象的创建与访问 //方式一(通过内置构造函数创建后添加属性) var obj = new Object(); obj.name = 'Lucy'; //通过点添加属性 ...

  3. 邮件基本常识普及(to/cc/bcc)

    http://blog.sina.com.cn/s/blog_5572b4b5010009ul.html 前两天,某个同事发的一封邮件着实把我给郁闷了,他发的是图片形式的笑话,内容稍稍有点不太健康,这 ...

  4. 淘宝海量数据库之八-攻克随机IO难关 -----阿里正祥的博客

    http://blog.sina.com.cn/s/blog_3fc85e260100qwv8.html

  5. lol匹配算法

    这是Riot的Design Director Tom Cadwell专门为中国玩家写的解说匹配系统工作原理的帖子. 同一时候为了让大家更好的理解匹配系统,假设您认为您遇到了特别不公平的匹配,请回复游戏 ...

  6. Redux-saga学习笔记

    概述 Redux-saga在Redux应用中扮演’中间件’的角色,主要用来执行数据流中的异步操作.主要通过ES6中的generator函数和yield关键字来以同步的方式实现异步操作. 基本用法: 使 ...

  7. 国产Linux滋生腐败

    回想过去,2002年12月11日至12日,信息产业部与科技部联合主办"Linux软件与应用猜測研讨会".影响中国IT业的重要人士,包含政府决策者.学界权威.主要Linux推动厂商等 ...

  8. Eclipse 报 “Exception in thread "main" java.lang.OutOfMemoryError: Java heap space ”错误的解决办法

    1.打开Eclipse软件,选择菜单栏run,在二级菜单中选择 Debug Configurations...  项,如下图所示. 2.在弹出的窗口中选择 (x)=Arguments 选项卡,VM a ...

  9. hadoop安装入门

    1.jdk安装和配置 1.1下载最新jdk文件 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-18802 ...

  10. Robots协议(爬虫协议、机器人协议)

    Robots协议(也称为爬虫协议.机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓 ...