前端H5代码:php
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> var socket = new WebSocket('ws://192.168.122.128:9502'); // 打开Socket socket.onopen = function(event) { socket.send('{"user":"<?php echo $user;?>" ,"type":"1"}'); }; socket.onmessage=function(event){ var data=eval("("+event.data+")"); console.log(data); document.getElementById('text').value+=data.msg+"\n"; } function sendMessage(touser){ var msg='{"type":"2","msg":"'+document.getElementById('msgbox').value+'","from_user":"<?php echo $user;?>","touser":"'+touser+'"}'; socket.send(msg); } </script> <textarea name="" id="text" cols="30" rows="10"></textarea> <input type="text" name="msgbox" id="msgbox" /> <button onclick="sendMessage('all');">发送</button> </body> </html>
后台CI代码:html
用户先登陆,登陆后,进入chat/index页面前端
include_once('Auth.php'); class Chat extends Auth { public function __construct(){ parent::__construct(); echo $this->username; } public function index(){ $this->load->helper('url'); $data=array( 'user'=>$this->username, ); $this->load->view('chat.php',$data); } }
在CLI模式下运行swoole/start 页面android
cd /mnt/hgfs/wwwroot/chat
php index.php swoole start
swoole/start 代码git
$server = new swoole_websocket_server("0.0.0.0", 9502); $server->on('open', function (swoole_websocket_server $server, $request) { echo "server: handshake success with fd{$request->fd}\n"; }); $server->on('message', function (swoole_websocket_server $server, $frame) { // echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $data=(array)json_decode($frame->data,true); print_r($data); if($data['type']==1){ echo " {$data['user']} 进入聊天室!\n"; $this->load->driver('cache'); $cache=$this->cache->file->get('clients'); $tmp=array(); if($cache){ $tmp=unserialize($cache); $tmp[$frame->fd]=array( 'id'=>$frame->fd, 'user'=>$data['user'], ); $save=serialize($tmp); $this->cache->file->save('clients',$save,300); }else{ $tmp[$frame->fd]=array( 'id'=>$frame->fd, 'user'=>$data['user'], ); $this->cache->file->save('clients',serialize($tmp),300);//缓存在线用户 } foreach($tmp as $v) { $server->push($v['id'], json_encode(array('type' => 1, 'msg' => "欢迎{$data['user']}进入聊天室!"))); } }else if($data['type']==2){ echo " {$data['from_user']} 对你们说:{$data['msg']} !\n"; if($data['touser']=='all'){ echo '全部用户'; $cache=$this->cache->file->get('clients'); $tmp=unserialize($cache); foreach($tmp as $v){ $server->push($v['id'],json_encode(array('type'=>2,'msg'=>"用户{$data['from_user']}对你们说:{$data['msg']} !"))); } } } }); $server->on('close', function (swoole_websocket_server $server, $fd) { $cache=$this->cache->file->get('clients'); $tmp=unserialize($cache); unset($tmp[$fd]); $this->cache->file->save('clients',serialize($tmp),500); echo "client {$fd} closed\n"; foreach($tmp as $v){ $server->push($v['id'],json_encode(array('type'=>3,'msg'=>"用户{$v['user']}离开了聊天室。"))); } }); $server->start();
功能比较简单,结合websocket+CodeIngiter+swoole。web
之后整合到android APP上。json