一般来说网络通讯经常使用的方式有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).

%% 启动服务并接受client的连接

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]),

      %%将接收到数据发送回client

      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 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. request.setAttribute()、session.setAttribute()和request.getParameter()的联系与区别(记录)

    1.session.setAttribute()和session.getAttribute()配对使用,作用域是整个会话期间,在所有的页面都使用这些数据的时候使用. 2.request.setAttr ...

  2. Maven根据不同环境打包不同配置文件

    开发项目时会遇到这个问题:开发环境,测试环境,生产环境的配置文件不同,打包时经常要手动更改配置文件,更改的少还可以接受,但是如果需要更多个配置文件,手动的方法就显得非常笨重了. 下面介绍一种方法,利用 ...

  3. 腾讯旗下网站的很多URL都包含“cgi-bin”,是什么意思?他们后台用什么语言?

    cgi-bin 这很有可能说明后台是C/C++写的. 动态Web技术刚出来的时候, 服务器调用本地应用程序处理http请求的技术. 通常是C/C++程序. 后来有了新的web开发技术后这类用的就比较少 ...

  4. 斑马Zebra驱动下载

    Zebra GT800 点击进入下载页-> 自动安装包[WINXP/WIN7/WIN8]点击进入下载页-> 添加打印机向导[WINXP/WIN7/WIN8]   热门下载 · Zebra ...

  5. 通过扩展jQuery UI Widget Factory实现手动调整Accordion高度

    □ 实现Accordion高度一致 <head> <meta name="viewport" content="width=device-width&q ...

  6. mysql 主从复制原理(转)

    本文转自https://blog.csdn.net/php_younger/article/details/59673879 mysql 主从复制原理 主从形式   mysql主从复制 灵活 一主一从 ...

  7. 高性能 Socket 组件 HP-Socket v3.2.1 正式公布

    HP-Socket 是一套通用的高性能 TCP/UDP Socket 组件,包括服务端组件.client组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C+ ...

  8. EasyUI Pagination 分页的两种做法

    EasyUI 的 datagrid 支持服务器端分页,但是官方的资料比较少,以下总结了两种 datagrid 的服务器端分页机制,可根据情况具体使用. 一:使用 datagrid 默认机制 后台: p ...

  9. Python已成为网络攻击的首选编程语言

    Python已成为网络攻击的首选编程语言 最新的调查数据表明,Python已经变成了世界上最热门的编程语言了,而Python的热门风也刮到了信息安全领域中.Python,摇身一变,也变成了黑客开发网络 ...

  10. pat 1060 比较科学计数法

    trick: 1.前导0 如:000001,000.000001 2.出现0时也要按照科学计数法输出 e.g. 4 00000.00000 0001 NO 0.0000*10^0 0.1*10^1 3 ...