實現一個聊天功能的對話框


額。。。先來看下總效果吧==》

下面分別有三個用戶,他們都分別發了聊天信息;

步驟:

一、把基本的架構寫好,

 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 } 已離開聊天室`);
}
})
})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM