Php与Erlang的Socket通信
一般来说网络通讯经常使用的方式有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通信的更多相关文章
- iOS开发之Socket通信实战--Request请求数据包编码模块
		
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
 - erlang的Socket参数含义
		
http://blog.csdn.net/pkutao/article/details/8572216 {ok, Listen} = gen_tcp:listen(?defPort, [binary, ...
 - 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?
		
这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...
 - php简单实现socket通信
		
socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...
 - Socket通信类
		
package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...
 - AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
		
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
 - socket通信
		
socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...
 - Android之Socket通信、List加载更多、Spinner下拉列表
		
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...
 - .NET开源高性能Socket通信中间件Helios介绍及演示
		
一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...
 
随机推荐
- git 的补丁使用方法
			
1.生成补丁 format-patch可以基于分支进行打包,也可以基于上几次更新内容打包. 基于上几次内容打包 git format-patch HEAD^ 有几个^就会打几个patch,从最近一次 ...
 - cocos2dx 3.0 中文 iconv 转换函数
			
//#include <string> #pragma once #include "cocos2d.h"; #include "iconv\include\ ...
 - MySQL优化器的成本模型
			
http://www.orczhou.com/index.php/2016/08/mysql-optimizer-cost-model-1/V
 - spring事務
			
spring事物 spring事物其实就是对数据库事物的一种支持,没有数据库事物的话,spring本身是不能提供事物支持的: 在最开始使用原始的jdbc连接数据库进行炒操作是, 获取连接后可以使用co ...
 - 【spring boot】spring boot后台时间正确,返回给前台的时间不正确,和后台差8个小时
			
后台打印的时间如下: 数据库存储时间如下: 接口返回给前台的时间如下: 相差8个小时. 原因如下: spring-boot中对于@RestController或者@Controller+@Respon ...
 - Oracle 快速插入1000万条数据的实现方式
			
1.使用dual配合connect by level create table BigTable as select rownum as id from dual connect by level & ...
 - python测试开发django-10.django连接mysql
			
前言 Django 对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle.本篇以mysql为例简单介绍django连接mysql进行数据操作 Django连 ...
 - FFMpeg开发使用
			
1.jjmpeg下载 https://code.google.com/p/jjmpeg/downloads/list 2.ffmpeg文档地址 https://www.ffmpeg.org/ 3.安卓 ...
 - 接口处理篇 accept bind connect atan2 htons inet_addr inet_aton inet_ntoa listen ntohl recv send sendto socket
			
accept(接受socket连线) 相关函数 socket,bind,listen,connect 表头文件 #include<sys/types.h> #include<sys/ ...
 - Html5 中获取镜像图像 - 解决 WebGL 中纹理倒置问题
			
Html5 中获取镜像图像 - 解决 WebGL 中纹理倒置问题 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致& ...