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);