額。。。先來看下總效果吧==》
下面分別有三個用戶,他們都分別發了聊天信息;
步驟:
一、把基本的架構寫好,
1 <div class="wrapper"> 2 <!-- 聊天信息框 --> 3 <div class="content" id="chat"> 4 <ul id="chat_conatiner"> 5 6 </ul> 7 </div> 8 9 <!-- 聊天輸入框 --> 10 <div class="action"> 11 <textarea name="content" id="input"></textarea> 12 <button class="btn btn-success" id="clear">清屏</button> 13 <button class="btn btn-success" id="send">發送</button> 14 </div> 15 </div> 16 </body>
二、我們要像搭建node服務器那樣,重新封裝一下配置文件js ——也就是“server.js”,因為我們還是要用到node.js 服務器連接客戶端來建立一個實時聊天室。代碼如下:
1 //引入第三方模塊插件 2 var express = require('express'), 3 io = require('socket.io'); 4 5 6 //創建app 7 var app = express(); 8 9 //給app綁定一個監聽的端口 10 var server = app.listen(3000,function(){ 11 console.log('程序已啟動'); 12 }); 13 14 15 //用socket來監聽當前服務 16 var ws = io.listen(server); 17 18 19 //socket事件 20 21 var checkUser = function(nickname) 22 { 23 //ws.sockets.sockets 存放所有連接的用戶 24 for(var k in ws.sockets.sockets) 25 { 26 if(ws.sockets.sockets[k].nickname == nickname) 27 { 28 //該用戶已經存在了 29 return true; 30 } 31 } 32 33 //用戶不存在 34 return false; 35 } 36 37 //當有客戶端連接上來的時候會觸發到當前的事件函數 38 ws.on('connection',function(client){ 39 40 //給客戶端綁定一個事件用來接收昵稱 41 client.on('join',function(nickname){ 42 43 //用戶不存在 44 //給當前客戶端對象添加自定義屬性 45 client.nickname = nickname; 46 47 //調用客戶端的提醒事件 48 ws.sockets.emit('notice','系統',`${nickname}已加入群聊(*^__^*) 嘻嘻……`); 49 50 }) 51 52 client.on('message',function(content){ 53 54 //把他信息發給所有人,但是除了自己 廣播 55 //調用客戶端的接收方法 56 client.broadcast.emit('message',client.nickname,content); 57 }); 58 59 60 client.on('disconnect',function(){ 61 62 if(client.nickname) 63 { 64 ws.sockets.emit('notice',"系統",`${client.nickname}已離開聊天室`); 65 } 66 }) 67 })
三、這里要注意一下,要引進我們的 socket.io.js
然后下面就是我們要寫的業務邏輯
1 <script> 2 //先連接 3 var ws = io.connect("http://localhost:3000"); 4 5 //客戶已存在的事件接收 6 ws.on('checkUser',function(nickname){ 7 var nickname = prompt(`${nickname}已經存在了`); 8 9 while(!nickname) 10 { 11 nickname = prompt('昵稱不能為空'); 12 } 13 14 //將重新輸入的結果再給會服務器驗證是否存在 15 ws.emit('join',nickname); 16 17 }) 18 19 //在客戶端上面綁定事件 20 ws.on('connect',function(){ 21 var nickname = prompt("請輸入你的昵稱"); 22 23 while(!nickname) 24 { 25 nickname = prompt('昵稱不能為空'); 26 } 27 28 //將昵稱傳遞給服務器 29 ws.emit('join',nickname); 30 }); 31 32 33 //接收一個系統服務器通知的消息 34 ws.on('notice',function(from,msg){ 35 addMessage(from,msg); 36 }); 37 38 //將信息添加到頁面里面 39 function addMessage(from,msg) 40 { 41 var li = document.createElement("li"); 42 43 li.innerHTML = `<span>${from}:</span>${msg}`; 44 45 var chat = document.getElementById("chat_conatiner"); 46 47 chat.append(li); 48 49 document.getElementById("chat").scrollTop = document.getElementById("chat").scrollHeight; 50 } 51 52 //清屏 53 document.getElementById("clear").addEventListener('click',function(){ 54 document.getElementById("chat_conatiner").innerHTML = ""; 55 }); 56 57 //發送 58 document.getElementById("send").addEventListener("click",function(){ 59 send(); 60 }); 61 62 63 64 document.getElementById("input").addEventListener("keydown",function(e){ 65 if(e.keyCode == 13 && e.ctrlKey) 66 { 67 send(); 68 } 69 }); 70 71 72 function send() 73 { 74 var content = document.getElementById("input"); 75 76 if(content.value.trim().length > 0) 77 { 78 //添加到自己的區域里面 79 addMessage("我",content.value); 80 81 //發送給服務器 82 ws.emit('message',content.value); 83 84 } 85 86 content.value = ""; 87 KindEditor.html("#input",""); 88 89 //產生焦點 90 // KindEditor.focus(); 91 92 93 } 94 95 //客戶端要接收服務器廣播回來的用戶信息 96 ws.on("message",function(from,msg){ 97 addMessage(from,msg); 98 }); 99 100 101 102 103 </script>
//引入第三方模塊插件
var
express =
require(
'express'),
io =
require(
'socket.io');
//創建app
var
app =
express();
//給app綁定一個監聽的端口
var
server =
app.
listen(
3000,
function(){
console.
log(
'程序已啟動');
});
//用socket來監聽當前服務
var
ws =
io.
listen(
server);
//socket事件
var
checkUser =
function(
nickname)
{
//ws.sockets.sockets 存放所有連接的用戶
for(
var
k
in
ws.
sockets.
sockets)
{
if(
ws.
sockets.
sockets[
k].
nickname ==
nickname)
{
//該用戶已經存在了
return
true;
}
}
//用戶不存在
return
false;
}
//當有客戶端連接上來的時候會觸發到當前的事件函數
ws.
on(
'connection',
function(
client){
//給客戶端綁定一個事件用來接收昵稱
client.
on(
'join',
function(
nickname){
//用戶不存在
//給當前客戶端對象添加自定義屬性
client.
nickname =
nickname;
//調用客戶端的提醒事件
ws.
sockets.
emit(
'notice',
'系統',
`
${
nickname
}
已加入群聊(*^__^*) 嘻嘻……`);
})
client.
on(
'message',
function(
content){
//把他信息發給所有人,但是除了自己 廣播
//調用客戶端的接收方法
client.
broadcast.
emit(
'message',
client.
nickname,
content);
});
client.
on(
'disconnect',
function(){
if(
client.
nickname)
{
ws.
sockets.
emit(
'notice',
"系統",
`
${
client.
nickname
}
已離開聊天室`);
}
})
})