ä¸ãæ路讲解
æå¡ç«¯çwebsocketæå¡ç±»ä¼¼äºç°å®çæ´»ä¸çé®å±ã
å½å®¢æ·ç«¯è¿æ¥ä¸æå¡ç«¯æ¶ï¼ä»£è¡¨å®¢æ·æèªå·±çå°ååç¥äºé®å±ã
å½å®¢æ·ç«¯åéæ¶æ¯å°æå¡ç«¯ï¼å代表客æ·æ信件æéå°äºé®çã
è¥æ¶æ¯æ¥æ¶æ¹å¨çº¿ï¼åwebsocketä¼å°æ¶æ¯è½¬åç»æ¶æ¯æ¥æ¶æ¹ï¼ç±»ä¼¼äºé®å±è½æ ¹æ®æ¶ä»¶äººå°åç²¾åæéãè¥æ¶æ¯æ¥æ¶æ¹ä¸å¨çº¿ï¼åwebsocketä¼å¨ä¸ä¸æ¬¡æ¶æ¯æ¥æ¶æ¹è¿æ¥æå¡æ¶è¿è¡æ¶æ¯æ¨éãå¨ç°å®çæ´»ä¸å°±æ¯æ¥æ æ¤äººçæ åµä¸ï¼é®å±ä¼å¨è¿ä¸ªäººåºç°çæ¶åï¼æ信件交å°è¿ä¸ªäººæä¸ã
å¨å®é 项ç®ä¸ï¼ä¹ä¼æå ¶ä»æ段æ¥æ¥æ£ç¨æ·å¨ä¸çº¿çç¯èï¼æ¯å¦çä¿¡éç¥ï¼é®ä»¶éç¥ï¼çè³è¯é³çµè¯éç¥ï¼ééï¼ã
å ³äºåè½ï¼
- å³æ¶é讯ãå¨çº¿è天室ãæ¶æ¯æ¨éãç´æç³»ç»é½æ¯å®ç°ç¹å¯¹ç¹æç¹å¯¹é¢çç²¾åæ¶æ¯æ¨éï¼ä¸è¬æ¶æ¯åéåæ¥æ¶æ¹æ¯å»ºç«äºä¸å®èç³»ï¼å¦å¥½åå ³ç³»ï¼ç¾¤ç»å ³ç³»ï¼ä¸ä¸çº§å ³ç³»ãç²ä¸å ³ç³»ã
- å¼¹å¹ç³»ç»åæ¯æ å·®å«æ¨éï¼ä¸è¬æ¶æ¯åéæ¹åæ¥æ¶æ¹åªæ¯ä¸ç§ä¸´æ¶æ§çå ³ç³»ï¼ä¸è¬æ¯è¿è¡å®æ¶æ¨éï¼å³ç¨æ·åªè½æ¶å°è¿æ¥å°æå¡åçæ¶æ¯ï¼ï¼å 为æ°æ®éæ¯è¾å¤§ï¼ä¸è¬ä¸ä¼å¯¹ä¹åçæ¶æ¯è¿è¡æ¨éï¼ã
websocketçåçæ¯æ ¸å¿ï¼ææ¡äºæ ¸å¿å°±å¯ä»¥æ ¹æ®éæ±ï¼è®¾è®¡å¥½æ¶æ¯æ¨éæ¶æºï¼æ¶æ¯æ¥æ¶æ¹ï¼å®ç°ä¸åçåè½ã
æ¶æ¯ä¸è½¬/æ¨éçå®ç°åæï¼
- å¯ä¸æ§ 客æ·ç«¯æ¯è¿æ¥ä¸æ¬¡æå¡ç«¯ï¼æå¡ç«¯é½ä¼åé ä¸ä¸ªæ°ç线ç¨æ¥å¤ç两è ä¹é´çè¿æ¥ï¼æå¼è¿æ¥ï¼åææ对åºç线ç¨ï¼è¿ä¸ªæ¯æ们设计æ°æ®è¡¨æ¶çä¸ä¸ªéè¦ä¾æ®ï¼ç¨æ¥è¯å«ç¨æ·Aæ¯ç¨æ·Aï¼ç±»ä¼¼sessionçä½ç¨ï¼ã
- ååæ§ è¿æ¥å¨æå¡ç«¯ç客æ·ç«¯ï¼é½å¯ä»¥åæå¡ç«¯åéæ¶æ¯ï¼ä¹å¯ä»¥æ¥æ¶æ¥èªæå¡ç«¯çæ¶æ¯ãè¿ä¸ç¹æ¯å®ç°å³æ¶é讯ãå¨çº¿è天室ãæ¶æ¯æ¨éçéè¦æ段ã
äºãæ°æ®è¡¨è®¾è®¡
swoole线ç¨-ç¨æ·è¡¨
CREATE TABLE `blog_ws_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL DEFAULT '0' COMMENT 'è°èµ·websocketæå¡çç¨æ·id',
`f_id` int(11) NOT NULL DEFAULT '0' COMMENT 'swoole线ç¨id',
`ip` char(15) NOT NULL DEFAULT '0.0.0.0' COMMENT '客æ·ç«¯IPå°å',
`dtime` datetime NOT NULL DEFAULT '2019-01-01 00:00:00' COMMENT 'è°èµ·æ¶é´',
`time` int(11) NOT NULL DEFAULT '0' COMMENT 'è°èµ·æ¶é´æ³',
`is_online` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'æ¯å¦å¨çº¿ï¼0-ä¸çº¿ï¼1-ä¸çº¿',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8mb4;
chatè天æ¶æ¯è®°å½è¡¨
CREATE TABLE `blog_chats` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`from_id` int(11) NOT NULL DEFAULT '0' COMMENT 'æ¶æ¯åéæ¹id',
`to_id` int(11) NOT NULL DEFAULT '0' COMMENT 'æ¶æ¯æ¥æ¶æ¹id',
`group_id` int(11) NOT NULL DEFAULT '0' COMMENT '群ç»id',
`content` varchar(255) NOT NULL DEFAULT ' ' COMMENT 'æ¶æ¯å
容',
`img` varchar(255) NOT NULL DEFAULT ' ' COMMENT 'å¾çå°å',
`dtime` datetime NOT NULL DEFAULT '2018-01-01 00:00:00' COMMENT 'åéæ¶é´',
`time` int(11) NOT NULL DEFAULT '0' COMMENT 'åé¦/åå¤æ¶é´æ³',
`is_send` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'æ¯å¦å·²åéï¼0-æªåéï¼1-å·²åé',
`is_del` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'æ¯å¦å é¤ï¼0-å¦ï¼1-å é¤',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=125 DEFAULT CHARSET=utf8 COMMENT='è天记å½è¡¨';
ä¸ãæå¡ç«¯ä»£ç ï¼
ws.phpï¼
<?php
namespace app\network\controller;
/**
* @Filename :Ws_log.php
* @CreateTime :2019 2019/1/1 13:29
* @Author :Robin
* @Description :
*/
class Ws
{
public $host = '0.0.0.0';
public $ip = '127.0.0.1';
public $port = 8812;
public $username = 'root';
public $password = 'root';
public $database = 'blog';
public $ws;
public $db;
public function __construct()
{
$this->ws = new \swoole_websocket_server($this->host, $this->port);
//é¢å对象çåè°
$this->ws->on('open',[$this,'onOpen']);
$this->ws->on('message',[$this,'onMessage']);
$this->ws->on('close',[$this,'onClose']);
//å¼å¯websocketæå¡
$this->ws->start();
}
/**
* @FunctionName :onOpen
* @CreateTime :2019 2019/1/1 13:31
* @Author :Robin
* @Descript çå¬wsè¿æ¥äºä»¶
* @param $ws
* @param $request
*/
public function onOpen($ws,$request)
{
$f_id = $request->fd;
$info = $request->server;
$ip = $info['remote_addr'];
$request_uri = trim($info['request_uri'],'/');
$data = explode('/',$request_uri);
$dtime = date('Y-m-d H:i:s');
$time = time();
//è¿æ¥æ°æ®åº
$this->db = mysqli_connect($this->ip,$this->username,$this->password) or die(mysqli_connect_error());
mysqli_select_db($this->db,$this->database) or die();
$sql = "insert into blog_ws_log(user_id,f_id,ip,dtime,time,is_online) values($data[0],$f_id,'$ip','$dtime',$time,1)";
$this->db->query($sql);
//å¦æææªè¯»æ¶æ¯ï¼è¿è¡æ¶æ¯å±ç¤º
$sql = "select count(id),from_id from blog_chats where to_id = $f_id and is_send = 0 group by from_id";
$result = $this->db->query($sql);
if($result->num_rows > 0){
$data = mysqli_fetch_all($result);
$ws->push($f_id,json_encode($data));
}
$this->db->close();
}
/**
* @FunctionName :onMessage
* @CreateTime :2019 2019/1/1 13:32
* @Author :Robin
* @Descript çå¬wsæ¶æ¯äºä»¶
* @param $ws
* @param $frame
*/
public function onMessage($ws,$frame)
{
//$frame->fd;åéæ¶æ¯ç线ç¨
$data = json_decode($frame->data,true);
//è¿æ¥æ°æ®åº
$this->db = mysqli_connect($this->ip,$this->username,$this->password) or die(mysqli_connect_error());
mysqli_select_db($this->db,$this->database) or die();
$content = htmlspecialchars($data['content']);
if(strpos($content,'data:image') === false){
$img = '';
}else{
//ä¸ä¼ å¾çï¼å¦ä½å¤ç
$content = '';
$img = '';
}
$dtime = date('Y-m-d H:i:s');
$time = time();
$sql = "insert into blog_chats(from_id,to_id,content,img,dtime,time) values($data[from_id],$data[to_id],'$content','$img','$dtime',$time)";
$message_id = $this->db->query($sql);
//å¦ææ¶æ¯æ¥æ¶æ¹å¨çº¿ï¼å客æ·ç«¯åéæ¶æ¯
$sql = "select f_id from blog_ws_log where is_online = 1 and user_id = $data[to_id] order by id desc limit 1";
$res = $this->db->query($sql);
if($res->num_rows){
$to_id = mysqli_fetch_assoc($res)['f_id'];
$push_data = json_encode(['from_id' => $data['from_id'],'content' => htmlspecialchars_decode($content),'img' => $img]);
$ws->push($to_id,$push_data);
$sql = "update blog_chats set is_send = 1 where id = $message_id";
$this->db->query($sql);
}
$this->db->close();
}
/**
* @FunctionName :onClose
* @CreateTime :2019 2019/1/1 13:35
* @Author :Robin
* @Descript çå¬wså
³éäºä»¶
* @param $ws
* @param $fd
*/
public function onClose($ws,$fd)
{
$this->db = mysqli_connect($this->ip,$this->username,$this->password) or die(mysqli_connect_error());
mysqli_select_db($this->db,$this->database) or die();
$sql = "update blog_ws_log set is_online = 0 where f_id = $fd";
$this->db->query($sql);
$this->db->close();
}
public function __destruct()
{
$this->db = mysqli_connect($this->ip,$this->username,$this->password) or die(mysqli_connect_error());
mysqli_select_db($this->db,$this->database) or die();
$sql = "update blog_ws_log set is_online = 0";
$this->db->query($sql);
$this->db->close();
}
}
$obj = new Ws();
åã客æ·ç«¯ä»£ç
çå¬æ¶æ¯æ¨éäºä»¶çws.js
var admin_id = $('#admin_id').val();
var url = "ws://ip:port/";
var ws = new WebSocket(url+admin_id);
/**
* çå¬è¿æ¥æå¼äºä»¶
* @param evt
*/
ws.onopen = function(evt){
var data = JSON.parse(evt.data);
};
/**
* çå¬æ¶æ¯æ¨éäºä»¶ï¼å½æå¡ç«¯å客æ·ç«¯æ¨éæ¶æ¯æ¶ï¼è°èµ·è¯¥æ¹æ³
* @param evt
*/
ws.onmessage = function(evt){
var data = JSON.parse(evt.data);
var png = "/static/network/img/icon01.png";
var date = new Date();
var Y = date.getFullYear() + '-';
var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + ' ';
var hh = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() + ':';
var mm = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() + ':';
var ss = date.getSeconds() < 10 ? '0' + date.getDate() : date.getSeconds() ;
var demo = "<div class='clearfloat'><div class='author-name'><small class='chat-date'>" + Y + M + D +' ' + hh + mm + ss +"</small></div><div class='left'><div class='chat-avatars'><img src='" + png + "' alt='头å'></div>";
if(data.img == ''){
demo += "<div class='chat-message'>" + data.content + "</div></div></div";
}else{
demo += "<div class='chat-message'><img src='" + data.img + "' alt=''></div></div></div>";
}
$(".chatBox-content-demo").append(demo);
};
/**
* çå¬è¿æ¥é误äºä»¶
* @param evt
*/
ws.onerror = function(evt){
};
è¿å ¥è天å表çé¢ï¼chat.js
$(".chat-list-people").click(function () {
var n = $(this).index();
$(".chatBox-head-one").toggle();
$(".chatBox-head-two").toggle();
$(".chatBox-list").fadeToggle();
$(".chatBox-kuang").fadeToggle();
$('#to_id').val($(this).attr('data-id'));
//ä¼ åå
$(".ChatInfoName").text($(this).children(".chat-name").children("p").eq(0).html());
//ä¼ å¤´å
$(".ChatInfoHead>img").attr("src", $(this).children().eq(0).children("img").attr("src"));
//è天æ¡é»è®¤æåºé¨
$(document).ready(function () {
$("#chatBox-content-demo").scrollTop($("#chatBox-content-demo")[0].scrollHeight);
});
$.post('message_list',{'to_id':admin_id,'from_id':$(this).attr('data-id')},function (res) {
var data = JSON.parse(res);
var png = "/static/network/img/icon01.png";
console.dir(data);
$(".chatBox-content-demo").children().remove();
for(var i=0;i<data.length;i++){
var demo = "<div class='clearfloat'><div class='author-name'><small class='chat-date'>" + data[i].dtime +"</small></div>";
if(data[i].from_id == admin_id){//æ¬äººåç
demo += "<div class='right'><div class='chat-message'>";
if(data[i].img == ''){
demo += data[i].content;
}else{
demo += "<img src='" + data[i].img +"'";
}
demo += "</div><div class='chat-avatars'><img src='" + png + "' alt='头å'></div></div></div>"
}else{//对æ¹åç
demo += "<div class='left'><div class='chat-avatars'><img src='" + png + "' alt='头å'></div><div class='chat-message'>";
if(data[i].img == ''){
demo += data[i].content;
}else{
demo += "<img src='" + data[i].img +"'";
}
demo += "</div></div></div>"
}
$(".chatBox-content-demo").append(demo);
}
});
});
äºãä¸äºè¯´æ
æå ç¹æ¯è¾éè¦çå°æ¹ï¼
- 客æ·ç«¯è¿æ¥æå¡ç«¯æ¶ï¼è¦æwebsocketç线ç¨å客æ·æ è¯å½¢æç»å®å ³ç³»ï¼å¹¶ä¸å¨å®¢æ·ç«¯æå¼æ¶ï¼åæ¶å¨æ°æ®è¡¨ä¸æ´æ°ç¶æã
- 客æ·ç«¯åéæ¶æ¯æ¶ï¼åºè¯¥è®°å½æ¶æ¯åéæ¹åæ¥æ¶æ¹ï¼å°±ååä¿¡ä¸æ ·ï¼å¦æå件人ï¼å¯ä»¶äººé½ä¸ç¥éï¼é®å±è¯¥æä¹å¤ç信件å¢ï¼æäºåè½çå®ç°ä¸éè¦è¿ä¸¤ä¸ªåæ°ï¼ä½æ¯è®°å½ä¸æ¥æ»æ¯å¥½çãåå ¥æ¶æ¯è¡¨çåºè¯¥æ¯æ¶æ¯åéæ¹åæ¥æ¶æ¹çç¨æ·æ è¯ï¼èä¸æ¯çº¿ç¨idï¼å 为线ç¨idæ¯æ³¢å¨æ§å¾å¤§çï¼ä¸´æ¶æ§çï¼ä¸ä¸æ¬¡è¿æ¥åä¸ä¸æ¬¡è¿æ¥å¾å°ç线ç¨idæ¯ä¸ä¸æ ·çã
è½åæéï¼å¯è½ä»£ç ä¸æçæ¼çå°æ¹ï¼æ¬¢è¿å¤§å®¶äº¤æµææ£ï¼