Swoole-WebSocket-Chat 聊天室前后端demo
这几天花了些时间在研究linux和swoole,后来发现了用Cygwin来代替unix。
技术点就是基于swoole的WebSocket 实现聊天室功能,
参考了部分博主的教程,我就直接上前后端的代码
<?php //创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = new swoole_websocket_server("0.0.0.0", 9502); //监听WebSocket连接打开事件 $ws->on("open", function ($ws, $request) { $msg["user"] = "系统消息"; $msg["content"] = "欢迎用户 ".$request->fd." 来到聊天室 "; sendAllClient($ws, $msg); }); //监听WebSocket消息事件 $ws->on("message", function ($ws, $frame) { $msg["user"] = "用户".$frame->fd; $msg["content"] = "{$frame->data} "; sendAllClient($ws, $msg, $frame); }); //监听WebSocket连接关闭事件 $ws->on("close", function ($ws, $fd) { //删除已断开的客户端 // unset($ws->user_c[$fd-1]); $msg["user"] = "系统消息"; $msg["content"] = "用户 {$fd} 退出了聊天室 "; sendAllClient($ws, $msg); }); //发送消息到所有在线的客户端 function sendAllClient($ws, $msg, $frame=null){ var_dump($ws->connections); $msg = implode(",", $msg); foreach($ws->connections as $fd){ $ws->push($fd, $msg); //如果是某个客户端,自己发的则加上isnew属性,否则不加 // if($frame->fd == $fd){ // $ws->push($frame->fd, $frame->data.","isnew":"""); // }else{ // $ws->push($fd, $msg); // } } } $ws->start();
<!doctype html> <html> <head> <meta charset="utf-8"> <title>Swoole-WebSocket-Chat</title> <link rel="shortcut icon" href="favicon.png"> <link rel="icon" href="favicon.png" type="image/x-icon"> <link type="text/css" rel="stylesheet" href="css/style.css"> <script type="text/javascript" src="js/jquery.min.js"></script> </head> <body> <div class="chatbox"> <div class="chat_top fn-clear"> <!-- <div class="logo"><img src="images/logo.png" width="190" height="60" alt=""/></div> --> <div class="uinfo fn-clear"> <!-- <div class="uface"><img src="images/hetu.jpg" width="40" height="40" alt=""/></div> --> <!-- <div class="uname"> 河图<i class="fontico down"></i> <ul class="managerbox"> <li><a href="#"><i class="fontico lock"></i>修改密码</a></li> <li><a href="#"><i class="fontico logout"></i>退出登录</a></li> </ul> </div> --> </div> </div> <div class="chat_message fn-clear"> <div class="chat_left"> <!-- 消息窗口 --> <div class="message_box" id="message_box"> <!-- <div class="msg_item fn-clear"> <div class="uface"><img src="images/53f44283a4347.jpg" width="40" height="40" alt=""/></div> <div class="item_right"> <div class="msg">mao</div> <div class="name_time">fn-clear</div> </div> </div> <div class="msg_item fn-clear"> <div class="uface"><img src="images/hetu.jpg" width="40" height="40" alt=""/></div> <div class="item_right"> <div class="msg own"></div> <div class="name_time">河图 · 30秒前</div> </div> </div> --> </div> <!-- 消息编辑器 --> <div class="write_box"> <textarea id="message" name="message" class="write_area" placeholder="说点啥吧..."></textarea> <input type="hidden" name="fromname" id="fromname" value="河图" /> <input type="hidden" name="to_uid" id="to_uid" value="0"> <div class="facebox fn-clear"> <div class="expression"></div> <div class="chat_type" id="chat_type">群聊</div> <button name="" class="sub_but">提 交</button> </div> </div> </div> <div class="chat_right"> <!-- <ul class="user_list" title="双击用户私聊"> <li class="fn-clear selected"><em>所有用户</em></li> <li class="fn-clear" data-id="1"><span><img src="images/hetu.jpg" width="30" height="30" alt=""/></span><em>河图</em><small class="online" title="在线"></small></li> <li class="fn-clear" data-id="2"><span><img src="images/53f44283a4347.jpg" width="30" height="30" alt=""/></span><em>猫猫</em><small class="online" title="在线"></small></li> <li class="fn-clear" data-id="3"><span><img src="images/53f442834079a.jpg" width="30" height="30" alt=""/></span><em>白猫</em><small class="offline" title="离线"></small></li> </ul> --> </div> </div> </div> <script type="text/javascript"> //swoole webSocket var exampleSocket = new WebSocket("ws://192.168.5.66:9502"); exampleSocket.onopen = function (event) { // var fromname = $("#fromname").val(); // exampleSocket.send("欢迎 "+fromname+" 来到聊天室!"); }; exampleSocket.onmessage = function (event) { var eventData = event.data; // if (eventData == "") { // showMessage(eventData); // } var arr = eventData.split(",") var msg = []; msg["user"] = arr[0]; msg["content"] = arr[1]; showMessage(msg); console.log(msg["user"], msg["content"]); } function sendMsg(){ exampleSocket.send(document.getElementById("message").value); } //html content $(document).ready(function(e) { $("#message_box").scrollTop($("#message_box")[0].scrollHeight + 20); $(".uname").hover( function(){ $(".managerbox").stop(true, true).slideDown(100); }, function(){ $(".managerbox").stop(true, true).slideUp(100); } ); var fromname = $("#fromname").val(); var to_uid = 0; // 默认为0,表示发送给所有用户 var to_uname = ""; $(".user_list > li").dblclick(function(){ to_uname = $(this).find("em").text(); to_uid = $(this).attr("data-id"); if(to_uname == fromname){ alert("您不能和自己聊天!"); return false; } if(to_uname == "所有用户"){ $("#toname").val(""); $("#chat_type").text("群聊"); }else{ $("#toname").val(to_uid); $("#chat_type").text("您正和 " + to_uname + " 聊天"); } $(this).addClass("selected").siblings().removeClass("selected"); $("#message").focus().attr("placeholder", "您对"+to_uname+"说:"); }); $(".sub_but").click(function(event){ // sendMessage(event, fromname, to_uid, to_uname); console.log($("#message").val()); var message = $("#message").val(); exampleSocket.send(message); }); /*按下按钮或键盘按键*/ $("#message").keydown(function(event){ var e = window.event || event; var k = e.keyCode || e.which || e.charCode; //按下ctrl+enter发送消息 // if((event.ctrlKey && (k == 13 || k == 10) )){ // sendMessage(event, fromname, to_uid, to_uname); // } }); }); function showMessage1(event, from_name, to_uid, to_uname){ var msg = $("#message").val(); if(to_uname != ""){ msg = "您对 " + to_uname + " 说: " + msg; } var htmlData = "<div class="msg_item fn-clear">" // + " <div class="uface"><img src="images/hetu.jpg" width="40" height="40" alt=""/></div>" + " <div class="item_right">" + " <div class="msg own">" + msg + "</div>" + " <div class="name_time">" + from_name + " · "+ dateObj.toLocaleDateString() +"</div>" + " </div>" + "</div>"; $("#message_box").append(htmlData); $("#message_box").scrollTop($("#message_box")[0].scrollHeight + 20); $("#message").val(""); } function showMessage(msg, from_name="河图", to_uname="所有用户"){ var htmlData = "<div class="msg_item fn-clear">" + " <div class="uface"><img src="images/hetu.jpg" width="40" height="40" alt=""/></div>" + " <div class="item_right">" + " <div class="msg own">" + msg["content"] + "</div>" + " <div class="name_time">" + msg["user"] + " · "+ getTime() +"</div>" + " </div>" + "</div>"; $("#message_box").append(htmlData); $("#message_box").scrollTop($("#message_box")[0].scrollHeight + 20); $("#message").val(""); } function getTime() { var date = new Date(); this.year = date.getFullYear(); this.month = date.getMonth() + 1; this.date = date.getDate(); this.day = new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六")[date.getDay()]; this.hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours(); this.minute = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(); this.second = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds(); var currentTime = this.year + "年" + this.month + "月" + this.date + "日 " + this.hour + ":" + this.minute + ":" + this.second + " " + this.day; return currentTime; } </script> </body> </html>
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了