`
cwqcwk1
  • 浏览: 86889 次
文章分类
社区版块
存档分类
最新评论

php 实现与 erlang 网络通讯

 
阅读更多

网络通讯常用的有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端,直接用位语法来匹配二进制数据即可


分享到:
评论

相关推荐

    基于Erlang的即时通讯系统的设计与实现_黄明.caj

    基于Erlang的即时通讯系统的设计与实现

    php实现与erlang的二进制通讯实例解析

    php与erlang之间实现文本通讯比较简单,这里就不做讨论,本文主要讨论的是php与erlang实现二进制通讯的实现方法。实现步骤如下: erlang端代码: 复制代码 代码如下:-module(server). -export([start/0]). -define( ...

    peb.so erlang(二廊桥php扩展)

    php扩展peb.so erlang通讯扩展,解决宝塔编译安装php peb扩展编译失败,直接上传到php扩展目录修改配置文件即可使用。

    走向Erlang网络编程性能调优之旅

    在这篇文章中,我们将探索Erlang网络编程性能调优的旅程,从开始的简单连接压力测试到最后的高性能网络服务器的实现。 首先,我们从简单的连接压力测试开始。使用Erlang编写了一个stress_test客户端,用于测试...

    最新最全rabbitmq与erlang版本匹配-2020-04-23.docx

    Erlang以其并发能力、容错性和分布式特性而闻名,是实现RabbitMQ的理想选择。正确地匹配RabbitMQ和Erlang的版本对于确保系统的稳定性和安全性至关重要。以下是一份2020年4月23日更新的匹配列表: **1. 支持的最小和...

    erlang编程 Introducing Erlang

    Erlang的并发模型和 otp 设计模式使得系统能够轻松实现负载均衡和故障切换。当一个节点或进程失败时,系统可以重新分配工作,确保服务的连续性。 ### 9. BEAM虚拟机 BEAM是Erlang运行时系统的名称,全称为伯尔尼...

    Python-一个用Python实现的Erlang结点使用gevent库

    标题中的“Python-一个用Python实现的Erlang结点使用gevent库”指的是一个Python项目,该项目旨在实现Erlang的节点功能,但完全使用Python语言编写,并且利用了gevent库来提高并发性能。Erlang是一种用于构建高可用...

    c# 版ErlangOtp跨平台通信框架(Java版的转译)

    标题中的"C#版ErlangOtp跨平台通信框架(Java版的转译)"指的是一个用C#语言实现的框架,其目标是提供与Erlang OTP系统进行跨平台通信的能力。Erlang OTP(开放电信平台)是Erlang编程语言的一个核心组件,它包含了一...

    Erlang emulator 实现分析

    Erlang emulator 实现分析Erlang emulator 实现分析

    erlang的timer和实现机制

    此外,提供的"erlang的timer和实现机制.pdf"和"更多erlang资料下载.txt"也是进一步学习和研究的好资源。 总之,Erlang的timer模块是其强大并发能力的一个体现,通过熟练掌握这一部分,开发者可以构建出更加高效和...

    java php python erlang 千万级内存数据性能比较

    在IT领域,尤其是在大数据处理和高性能计算中,选择正确的编程语言对于实现千万级内存数据的高效处理至关重要。本文将深入探讨Java、PHP、Python和Erlang这四种语言在处理千万级内存数据时的性能差异。 首先,让...

    Erlang官网下载过慢

    标签中提到了“Erlang Rabbit 异步通讯”,这意味着讨论的重点是Erlang如何与RabbitMQ结合实现异步通信。RabbitMQ是一个开源的消息代理,它遵循Advanced Message Queuing Protocol (AMQP)标准,提供了一种可靠、高效...

    C#与Erlang的群通信

    标题中的"C#与Erlang的群通信"指的是在编程领域中,使用C#和Erlang两种不同的编程语言进行集群或分布式系统间的通信。这两种语言各有特点,C#是微软开发的面向对象的编程语言,常用于Windows平台的开发,而Erlang则...

    Erlang与C构建的节点通讯完整例子

    Windows下Erlang与C构建的节点通讯完整例子,包含cnode工程项目,erlang引用例子。 配套文章:http://blog.csdn.net/mycwq/article/details/40836273

    erlang ranch实现的游戏tcp服务器

    Erlang Ranch是一个轻量级、高性能的网络协议栈,专为构建TCP服务器而设计。在游戏开发领域,由于其并发处理能力和强大的故障恢复机制,Erlang常被用来构建可扩展、高可用性的游戏服务器。Ranch库提供了一种简单的...

    erlang_gproc_扩展实现Erlang的全局ets

    Erlang是一种面向并发的、函数式编程语言,被广泛应用于分布式系统和高可用性服务。在Erlang中,ETS(Erlang Term Storage)是内置的一种高效、内存中的数据库,用于存储和检索Erlang术语。然而,ETS的一个限制是它...

    ErlangB_爱尔兰B公式_通信网络_

    Erlang B公式,也称为爱尔兰B公式,是通信网络中一个重要的理论工具,主要用于预测在给定服务速率下,多条电话线或信道如何有效地处理呼叫到达的流量。这个公式是由丹麦工程师A.K. Erlang在1909年提出的,它在现代...

    erlang资源

    1. **并发模型**:Erlang的并发基于轻量级进程(Lightweight Processes, LSPs),这些进程间的通信通过消息传递实现,这与传统的线程模型不同,具有更好的隔离性和容错性。 2. ** OTP(Open Telecom Platform)**:...

    KMP(Erlang)代码实现

    在给定的文件内容中,通过Erlang语言实现了KMP算法,以下是从文件内容中提取的关键知识点: 1. kmp_search/2函数:这是KMP算法的主函数,用于检查子串(SubString)是否存在于主串(String)中。该函数调用了kmp_...

Global site tag (gtag.js) - Google Analytics