首頁 後端開發 php教程 php 与 erlang 实现二进制通信

php 与 erlang 实现二进制通信

Jun 13, 2016 pm 12:35 PM
data define format quot timeout

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, > = 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端,直接用位语法来匹配二进制数据即可


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
Nginx timeout逾時如何配置 Nginx timeout逾時如何配置 May 12, 2023 pm 10:07 PM

keepalive_timeouthttp有一个keepalive模式,它告诉webserver在处理完一个请求后保持这个tcp连接的打开状态。若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。httpkeep-alive,網頁的每一個請求都是http(圖片,css等),而打開http請求是要先建立tcp連接,而如果一個頁面每個請求都要打開及關閉一個tcp連接就會做成資源的浪費.keepalive_timeout就是當一個http請求完成,其tcp連接會存留下

win11 clock watchdog timeout藍色畫面怎麼解決? win11 clock watchdog timeout藍色畫面怎麼解決? Feb 14, 2024 pm 04:00 PM

不少的用戶在升級完win11系統後會出現藍色畫面的現象,例如:clockwatchdogtimeout藍屏,那要怎麼解決?用戶可以看看更新驅動程式或是檢查過熱問題等等來進行操作,以下就讓本站來為用戶們來仔細的介紹一下clockwatchdogtimeout藍屏win11解決方法吧。 clockwatchdogtimeout藍色畫面win11解決方法1、更新驅動程式:更新CPU和主機板驅動程式可能解決問題。可以透過造訪製造商的網站下載最新的驅動程式。 2.檢查過熱問題:過熱也可能是導致此錯誤的原因之一

在Vue應用程式中使用vue-resource時出現「Error: timeout of xxxms exceeded」怎麼辦? 在Vue應用程式中使用vue-resource時出現「Error: timeout of xxxms exceeded」怎麼辦? Jun 24, 2023 pm 02:21 PM

在Vue應用程式開發中,使用vue-resource進行HTTP請求是常見的操作。儘管vue-resource提供了許多方便的功能,但有時我們會遇到「Error:timeoutofxxxmsexceeded」這樣的錯誤提示。這種錯誤通常是因為請求逾時而導致的。那麼,在這種情況下,我們該如何解決這個問題呢? 1.增加請求超時時間首先,我們可以透過增加請

在Vue應用程式中使用axios時出現「Error: timeout of xxxms exceeded」怎麼辦? 在Vue應用程式中使用axios時出現「Error: timeout of xxxms exceeded」怎麼辦? Jun 24, 2023 pm 03:27 PM

在Vue應用程式中使用axios時出現「Error:timeoutofxxxmsexceeded」怎麼辦?隨著網路的快速發展,前端技術也不斷地更新迭代,Vue作為優秀的前端框架,近年來受到大家的歡迎。在Vue應用程式中,我們常常需要使用axios來進行網路請求,但是有時候會出現「Error:timeoutofxxxmsexceeded」的錯誤

define怎麼定義多行宏 define怎麼定義多行宏 Oct 11, 2023 pm 01:24 PM

define定義多行巨集可以透過使用 `\` 將 `do { \ printf("%d\n", x); \ } while (0)` 分成了多行來定義。在巨集定義中,反斜線 `\` 必須是巨集定義的最後一個字符,且不能有空格或註解跟隨。使用 `\` 進行續行時,請注意保持程式碼的可讀性,並確保每個行末都有 `\`。

探究PHP中define函數的重要性與作用 探究PHP中define函數的重要性與作用 Mar 19, 2024 pm 12:12 PM

PHP中define函數的重要性與作用1.define函數的基本介紹在PHP中,define函數是用來定義常數的關鍵函數,常量在程式運行過程中不會改變其值。利用define函數定義的常數,在整個腳本中均可被訪問,具有全域性。 2.define函數的語法define函數的基本語法如下:define(&quot;常數名稱&quot;,&quot;常數值&amp;qu

504 gateway timeout怎麼解決 504 gateway timeout怎麼解決 Nov 27, 2023 am 10:55 AM

504 gateway timeout的解決方法:1、檢查伺服器負載;2、最佳化查詢和程式碼;3、增加逾時限制;4、檢查代理伺服器;5、檢查網路連線;6、使用負載平衡;7、監控和日誌; 8、故障排除;9、增加快取;10、分析請求。解決此錯誤通常需要綜合考慮多個因素,包括伺服器效能、網路連接、代理伺服器配置和應用程式最佳化等。

define怎麼定義條件編譯 define怎麼定義條件編譯 Oct 11, 2023 pm 01:20 PM

define定義條件編譯可以使用 `#ifdef`、`#ifndef`、`#if`、`#elif`、`#else` 和 `#endif` 預處理指令來實作。

See all articles