就在几天前,本人突然发觉自己能力有待提高,于是乎就花钱买了几节课学习了一下workerman中的GatewayWorker框架。
现总结如下:
入门:首先查看了workerman的官网https://www.workerman.net/ 上面有workerman、GatewayWorker的手册和下载地址,了解了一下workerman作为websocket的简单解释,之后便下载了GatewayWorker使用tp5框架开始测试开发。
本人开发环境wamp,项目总目录chat,配置好项目可以正常访问以后,首先将下载解压后的GatewayWorker文件放在chat/vendor目录下,首先修改了GatewayWorker/Applications/YourApp目录下的start_gateway.php文件,将
$gateway = new Gateway("tcp://0.0.0.0:8282");
修改为
$gateway = new Gateway("websocket://0.0.0.0:8282");
修改完以后,本人是在windows下开发所以打开GatewayWorker目录,点击start_for_win.bat就可以启动socket服务,服务启动以后并可以通过socket通信啦。
其中GatewayWorker中主要用到的文件是GatewayWorker/Application/YourApp目录下的Events.php文件,里面包含三个主要处理的方法,可以看一下注释,一个是连接方法onConnect,初始化客户端时首先要经过的就是该方法,这里可以做的功能有统计客户端数量、将socket服务给客户端自定义的client_id发送到客户端,以便进行客户端自定义id与我们自己的用户id进行绑定 ,这个可以稍后再说。第二个就是接受客户端发送的消息方法onMessage,客户端发送的消息都到达onMessage方法,然后在发送给指定的用户或客户端,客户端发送消息时可以进行类别区分,在onMessage方法中可以根据类型处理不同的逻辑。第三个断开连接时触发的方法onClose,学习中只是简单的介绍了一下该方法,并未真正时候,之后可以根据自己的业务需求做调整。
以上就是GatewayWorker里面我们主要操作的方法,切记:每次变更Event.php文件都要关闭socket服务重新启动,而且建议大家Event.php中只做通信功能,其他的逻辑处理不要在该文件里处理,还有一点,客户端(本人使用的老师给的html页面做客户端),本人在学习的时候在Event.php中用到的方法有Gateway::sendToClient()发送到客户端、Gateway::bindUid()客户端id与用户id绑定以及Gateway::isUidOnline()用户是否在线、Gateway::sendToUid()发送给指定用户等等。
接下来从客户端正式开始使用socket服务发送信息和接收信息,首先在页面引入jq文件,然后在<script>标签内建立通信
var ws = new WebSocket("ws://127.0.0.1:8282");
其中127.0.0.1是本地,是你socket服务所在的服务器ip,同上面启动的服务所在服务器ip相同,端口相同才可以连接服务成功,之后接收消息使用
ws.onmessage = function(e){
console.log(e);
}
所有接收到客户端的消息都在上面方法中处理。
发送消息的方法是
ws.send(data);
data是发送的数据,这里需要注意一点,客户端发送的消息、Event.php中onMessage方法接收以后又发出的消息、以及客户端onmessage数据都要统一为json格式,接收到的数据是json格式,发送数据也要是json格式,下面一步一步开始开发:
1、首先将socket服务默认给客户端的id与真实用户绑定
启动页面是首先经过Event.php的onConnect()方法,但目前只知道client_id,所以把client_id发送到客户端
public static function onConnect($client_id) { global $num; // 向当前client_id发送数据 //Gateway::sendToClient($client_id, "Hello $client_id\r\n"); // 向所有人发送 //Gateway::sendToAll("$client_id login\r\n"); echo "connect".++$num.":".$client_id."\n"; //在此绑定uid 但是这里没有uid 因此发送一个消息 Gateway::sendToClient($client_id,json_encode([ "type"=> "init", "client_id" => $client_id ])); }
2、html聊天页面(该页面一般可以通过控制器获取到当前接收用户id即fromid和要发送给对方的用户id即toid)
接收到启动时上面发送过来的信息,将当前用户发送到Event.php中
var from_id = {$from_id}; var to_id = {$to_id}; var ws = new WebSocket("ws://127.0.0.1:8282"); ws.onmessage = function (e) {
var message = eval("("+e.data+")"); switch (message.type){
case "init": var data = '{"type":"bind","from_id":"'+from_id+'"}';
ws.send(data);
return;
} console.log(message); }
3、Event.php中onMessage()方法接收客户端发送的消息,并进行绑定
public static function onMessage($client_id, $message) { $data = json_decode($message,true); if(!$data){ return; } switch ($data['type']){ case "bind": Gateway::bindUid($client_id,$data['from_id']); return; } }以上三步就将socket服务与我们真实的用户id进行绑定,一个真实用户可以绑定多个客户端id
好累,明天在更吧~