您的位置:首页 > 其它

使用Websocket+Swoole+CodeIngiter做聊天室

2015-12-06 16:18 357 查看
前端H5代码:

<!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代码:

用户先登录,登录后,进入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 页面

cd /mnt/hgfs/wwwroot/chat
php index.php swoole start


swoole/start 代码

$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。

以后整合到android APP上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: