客戶的即時溝通系統上線,是一個心理咨詢平台,心理咨詢師和咨詢者一對一即時溝通~
1.需要linux服務器安裝swoole
pecl install swoole
2.關閉防火牆或者添加端口9508
service iptables stop
3.如果用戶是阿里雲的服務器,注意一定要在安全組中添加9508端口(MDZZ這個弄了半天,一直以為是服務器安裝swoole的問題)
4.PHP抒寫后端代碼(我們項目使用的TP3.2框架)
<?php // +----------------------------------------------------------------------+ // | PHP version 5.5 | // +----------------------------------------------------------------------+ // | Copyright (c) 2013-2015 | // +----------------------------------------------------------------------+ // | Authors: Original Author | // | 微信基本接口模塊 繼承 Base 控制器 | // +----------------------------------------------------------------------+ // namespace System\Controller; use Think\Controller; use Wechat\Serve\Http; use Wechat\Serve\Token; class SwooleController extends Controller { //初始化程序 public function index(){ echo '正在啟動程序' . PHP_EOL; $this->server = new \swoole_websocket_server("0.0.0.0", 9501); //第一次連接的時候 $this->server->on('open', function (\swoole_websocket_server $server, $request) { echo "新用戶連接 fd是 {$request->fd}".PHP_EOL; }); $this->server->on('message', function (\swoole_websocket_server $server, $frame) { //收到用戶信息 //解析用戶數據信息 $data = json_decode($frame->data,true); //是否為第一次連接 if($data['type']=='init'){ //緩存用戶信息 S(md5($data['uid']),$frame->fd); S($frame->fd,md5($data['uid'])); echo '用戶'.$data['uid'].'注冊成功'.PHP_EOL; }else{ if( !S(md5($data['tid'])) ){ $server->push($frame->fd, '{"type":"notice","message":"用戶不在線"}'); }else{ //否則推送消息給其他用戶 $this->server->push(S(md5($data['tid'])), $frame->data); echo '發送給消息人'.$data['tid'].'的消息已經發送成功'.PHP_EOL; echo '他的FD為'.S(md5($data['tid'])).PHP_EOL; } } echo "接受到信息來自 {$frame->fd} ".PHP_EOL; echo " 內容 {$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}".PHP_EOL; }); //退出事件監控 $this->server->on('close', function ($ser, $fd) { echo "用戶 {$fd} 退出聊天系統" . PHP_EOL; S(md5(S($frame->fd)),null); S($frame->fd,null); }); echo '程序啟動完畢 啟動時間:' . date('Y-m-d H:i:s') . PHP_EOL; //啟動程序 $this->server->start(); } }
5.添加頁面前端代碼
<script> //websocket長連接方式,swoole方式 var wsServer = 'ws://IP地址:9501'; ws = new WebSocket(wsServer); var uid = {$uid}; var callid = {$callid}; ws.onopen = function(){ console.log("socket連接已打開"); data = { uid:uid, type:'init', }; ws.send(JSON.stringify(data)); }; ws.onmessage = function(e){ console.log("message:" + e.data); if(e.data) { info = $.parseJSON(e.data); type = info.type; msgid = info.msgid; // 推送消息到對方客戶端 $.post('/wechat/chat/success',{msgid:msgid},function(data){ if(data.error==200) { for_bottom(); $('.speak_box').append(data.data); } }); } }; ws.onclose = function(){ console.log("socket連接已斷開"); }; ws.onerror = function(e){ console.log("ERROR:" + e.data); }; //離開頁面時關閉連接 $(window).bind('beforeunload',function(){ ws.close(); } ); </script>
6.linux服務器運行你的后端代碼
php index.php system/swoole & (加入和號是運行后台運行)
7.前台刷新頁面,看console 提示socket打開成功就可以了。進行及時溝通了~