php實(shí)現(xiàn)與erlang的二進(jìn)制通訊實(shí)例解析
一般來(lái)說(shuō)網(wǎng)絡(luò)通訊常用的方式有2種:文本通訊和二進(jìn)制通訊。php與erlang之間實(shí)現(xiàn)文本通訊比較簡(jiǎn)單,這里就不做討論,本文主要討論的是php與erlang實(shí)現(xiàn)二進(jìn)制通訊的實(shí)現(xiàn)方法。實(shí)現(xiàn)步驟如下:
erlang端代碼:
-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).
%% 啟動(dòng)服務(wù)并接受客戶端的連接
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]),
%%將接收到數(shù)據(jù)發(fā)送回客戶端
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;
//超時(shí)時(shí)間:3秒
$fp = fsockopen("tcp://127.0.0.1", 5678, $errno, $errstr, $timeout/* 連接超時(shí)時(shí)間 */);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
stream_set_timeout($fp, $timeout);
//遠(yuǎn)程數(shù)據(jù)接收或發(fā)送超時(shí)時(shí)間
$format = "vva4";
$data = pack($format, 4, 10001, "abcd");
//$data 按照一定格式被打包成二進(jìn)制數(shù)據(jù)
fwrite($fp, $data);
if (!feof($fp)) {
$rs = fread($fp, 1024);
//讀取遠(yuǎn)程數(shù)據(jù)
if ($rs) {
$len = strlen($rs);
//$len 可以獲取數(shù)據(jù)的長(zhǎng)度,用以計(jì)算content的長(zhǎng)度
//在這個(gè)例子中,content 的長(zhǎng)度為 4
$format = "vlen/vcmd/a4content";
$data = unpack($format, $rs);
print_r($data);
} else {
echo "timeout!";
}
} else {
echo "timeout!";
}
fclose($fp);
}
?>
運(yùn)行正常的情況下,php端會(huì)顯示以下內(nèi)容:
Array ( [len] => 4 [cmd] => 10001 [content] => abcd )
針對(duì)通訊的一些說(shuō)明:
這里用到的是php的pack函數(shù)和unpack函數(shù):
pack函數(shù):將數(shù)據(jù)按照一定格式打包成二進(jìn)制數(shù)據(jù),生成的數(shù)據(jù)接近C/C++的結(jié)構(gòu)體數(shù)據(jù)(C/C++字符串帶結(jié)束符)。
unpack函數(shù):與pack相反,對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行解包。
對(duì)應(yīng)的erlang端,則直接用位語(yǔ)法來(lái)匹配二進(jìn)制數(shù)據(jù)即可。
- PHP中soap的用法實(shí)例
- PHP使用SOAP調(diào)用.net的WebService數(shù)據(jù)
- 重新封裝zend_soap實(shí)現(xiàn)http連接安全認(rèn)證的php代碼
- PHP XML error parsing SOAP payload on line 1
- js 與 php 通過(guò)json數(shù)據(jù)進(jìn)行通訊示例
- PHP+Ajax異步通訊實(shí)現(xiàn)用戶名郵箱驗(yàn)證是否已注冊(cè)( 2種方法實(shí)現(xiàn))
- 30分鐘學(xué)會(huì)用PHP寫帶數(shù)據(jù)庫(kù)的簡(jiǎn)單通訊錄
- PHP中實(shí)現(xiàn)進(jìn)程間通訊
- PHP實(shí)現(xiàn)Soap通訊的方法
相關(guān)文章
php將字符串轉(zhuǎn)換為數(shù)組實(shí)例講解
在本篇文章里小編給大家分享的是關(guān)于php將字符串轉(zhuǎn)換為數(shù)組實(shí)例講解,需要的朋友們可以學(xué)習(xí)下。2020-05-05
php數(shù)值轉(zhuǎn)換時(shí)間及時(shí)間轉(zhuǎn)換數(shù)值用法示例
這篇文章主要介紹了php數(shù)值轉(zhuǎn)換時(shí)間及時(shí)間轉(zhuǎn)換數(shù)值用法,涉及php strtotime及date等函數(shù)實(shí)現(xiàn)日期的字符串格式與Unix時(shí)間戳格式轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
PHP 時(shí)間轉(zhuǎn)換Unix時(shí)間戳代碼
PHP 時(shí)間轉(zhuǎn)換Unix 時(shí)間戳實(shí)現(xiàn)代碼。2010-01-01
探討:如何通過(guò)stats命令分析Memcached的內(nèi)部狀態(tài)
本篇文章是對(duì)通過(guò)stats命令分析Memcached的內(nèi)部狀態(tài)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
PHP實(shí)現(xiàn)在windows下配置sendmail并通過(guò)mail()函數(shù)發(fā)送郵件的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)在windows下配置sendmail并通過(guò)mail()函數(shù)發(fā)送郵件的方法,較為詳細(xì)的分析了Windows平臺(tái)sendmail配置步驟與相應(yīng)的使用技巧,需要的朋友可以參考下2017-06-06
php+jquery編碼方面的一些心得(utf-8 gb2312)
在開(kāi)發(fā)php與jquery的過(guò)程中,需要注意的一些心得,防止亂碼的出現(xiàn)。2010-10-10
PHP使用finfo_file()函數(shù)檢測(cè)上傳圖片類型的實(shí)現(xiàn)方法
這篇文章主要介紹了PHP使用finfo_file()函數(shù)檢測(cè)上傳圖片類型的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了finfo_file()函數(shù)的功能、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04
解析crontab php自動(dòng)運(yùn)行的方法
本篇文章是對(duì)crontab php自動(dòng)運(yùn)行的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

