socket通信過程原理圖
PHP socket構造類似QQ通信
服務端
set_time_limit(0);
$ip = '127.0.0.1';
$port = 8091;
/**
+------------------------
* socket服務端通行過程
+------------------------
* @socket_create 創建socket資源
* @socket_bind 綁定IP和端口
* @socket_listen 監聽
* @socket_accept 接收,創建子進程通信
* @socket_read 讀取消息
* @socket_write 寫消息
* @socket_close 關閉socket資源
*/
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
$r = socket_bind($socket,$ip,$port);
$r = socket_listen($socket,4);
do{
$sock = socket_accept($socket);
$i = (int)$sock;
$wm = '';
$rm = socket_read($sock,1024);
list($rid,$sid,$msg) = explode('|',$rm);
//TODO 以接收人$rid爲redis的key將json_encode([$sid,$msg,time()])存入redis;
//TODO 以發送人$sid爲redis的key從redis中獲取消息$rsm,$wm = implode('|',json_decode($rsm,true))
socket_write($sock,$wm);
socket_close($sock);
}while(true);
socket_close($socket);
客戶端
set_time_limit(0);
$ip = '127.0.0.1';
$port=8091;
/**
+--------------------------
* 客戶端socket連接過程
+--------------------------
* @socket_create 創建socket套接字
* @socket_connect 連接服務端ip和端口
* @socket_write 發送消息
* @socket_read 讀取消息
* @socket_close 關閉socket
*/
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_connect($socket,$ip,$port);
$rid = 100001;//接收人
$sid = 100002;//發送人
$sm = 'QQ test!';//消息
$wm = $rid.'|'.$sid.'|'.$sm.PHP_EOL;
socket_write($socket,$wm);
$rm = socket_read($socket,1024);
list($sid,$msg,$t) = explode('|',$rm);//解析服務端發回的消息
var_dump([$sid,$msg,$t]);
socket_close($socket);