windows 下layim Websocket 整合thinkphp3.2(使用workerman

分享 未结 精帖
8 9598
九九256
悬赏:5飞吻
本人之前对socket 并不熟悉,这次由于 layim的使用,百度了关于socket的资料,最终选择workerman的GatewayWorker,主要是拿来就用。
这里用到模式是,客户端端与GatewayWorker建立连接,然后返回对应的客户端ID,然后将客户端ID提交到thinkphp ,thinkphp收到ID后,和用户登陆id或者用户名进行绑定,然后再提交到GatewayWorker,然后thinkphp使用用户的ID或者用户名发送到GatewayWorker,GatewayWorker再进行消息推送到客户端。

下载GatewayWorker(http://www.workerman.net/download/GatewayWorker-for-win.zip);
修改Applications/YourApp/目录下的start_geteway.php 24行左右 修改为$gateway = new Gateway("websocket://0.0.0.0:8282");(端口打开哦)
启动GatewayWorker更目录下的start_for_win.bat()(启动报错请检查环境变量);

下载workerman的GatewayClient(https://github.com/walkor/GatewayClient);
将下载好的Gateway重命名为Gateway.class.php并修改命名空间为namespace Org\Util;


下载框架thinkphp;

将前面重命名Gateway.class.php复制到thinkphp/library/org/util/目录下;
thinkphp控制器代码如下:
<?php
namespace Home\Controller;
use Think\Controller;
class SocketController extends Controller{
function index(){//向客户端发送信息
$gateway= new \Org\Util\Gateway;
$gateway::$registerAddress = '127.0.0.1:1238';
$uid=1;
$msg=array(
'type'=>'msg',
'msg'=>'你好',
);
$msg=json_encode($msg);
$gateway::sendToUid($uid,$msg);
}
function bind(){//绑定客户端到对应的用户ID或用户名
if(!empty($_POST)){
$gateway= new \Org\Util\Gateway;
$gateway::$registerAddress = '127.0.0.1:1238';
$uid=1;
$client_id=I('post.client_id');
$gateway::bindUid($client_id, $uid);
}
}
}
?>

前端js代码
<script src="/layim/layui.js"></script>
<script>
layui.use(['layim','jquery'], function(layim){
var $=layui.jquery;

ws = new WebSocket("ws://127.0.0.1:8282");
// 服务端主动推送消息时会触发这里的onmessage
ws.onmessage = function(e){

// json数据转换成js对象
var data = eval("("+e.data+")");
var type = data.type || '';
switch(type){
// Events.php中返回的init类型的消息,将client_id发给后台进行uid绑定
case 'init':
// 利用jquery发起ajax请求,将client_id发给后端进行uid绑定
$.post('/socket/bind.html', {client_id: data.client_id}, function(data){}, 'json');
break;
// 当mvc框架调用GatewayClient发消息时直接alert出来
default ://这里接收消息类型
alert(e.data);//根据实际情况 填写
}
};
});
</script>
测试向前端发送消息截图:


文笔不是很好!
回帖
本帖已设置禁止回复