码迷,mamicode.com
首页 > 其他好文 > 详细

node+express+socket.io制作一个聊天室功能

时间:2014-12-16 23:56:46      阅读:384      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   ar   io   color   os   使用   sp   

 

首先是下载包:

npm install express

npm install socket.io

建立文件:

bubuko.com,布布扣

 

 

服务器端代码:server.js

 1 var http=require("http");
 2 var express=require("express");
 3 var sio=require("socket.io");
 4 
 5 var app=express();
 6 app.use(express.static(__dirname+"/"));
 7 
 8 var server=http.createServer(app);
 9 app.get("/", function (req, res) {
10     res.sendFile(__dirname+"/chart.html");
11 });
12 server.listen(1337,"127.0.0.1", function () {
13    console.log("开始监听");
14 });
15 var io=sio.listen(server);
16 var names=[];
17 io.sockets.on("connection", function (socket) {
18     socket.on("login", function (name) {
19         for(var i=0;i<names.length;i++){
20             if(names[i]==name){
21                 socket.emit("duplicate");
22                 return;
23             }
24         }
25         names.push(name);
26         io.sockets.emit("login",name);
27         io.sockets.emit("sendClients",names);
28     });
29     socket.on("chat", function (data) {
30         io.sockets.emit("chat",data);
31     });
32     socket.on("logout", function (name) {
33         for(var i=0;i<names.length;i++){
34             if(names[i]==name){
35                 names.splice(i,1);
36                 break;
37             }
38         }
39         socket.broadcast.emit("logout",name);
40         io.sockets.emit("sendClients",names);
41     });
42 });

 

静态页面 chart.html:

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title>Socket.IO聊天室</title>
 6     <link rel="stylesheet" href="chart.css" />
 7     <script src="/socket.io/socket.io.js"></script>
 8     <script type="text/javascript" src="chart.js"></script>
 9 </head>
10 <body onload="window_onload()">
11 <h1>Socket.IO聊天室</h1>
12 <div id="divContainer1">
13     <table class="tbDlg" border="0" cellpadding="3" cellspacing="0" width="100%">
14         <tr class="trDlg">
15             <td class="tdDlg" width="5">
16                 用户名:&nbsp;
17                 <input id="tbxUsername" type="text" value="游客" size="20" />
18                 <input id="btnLogin" type="button" value="登录" onclick="btnLogin_onclick();" />
19                 <input id="btnLogout" type="button" value="退出" disabled onclick="btnLogout_onclick();" />
20             </td>
21         </tr>
22     </table>
23 </div>
24 <div id="divLeft">
25     <div id="divchat"></div>
26     <div id="divContainer3">
27         <table class="tbDlg" border="0" cellpadding="3" cellspacing="0" width="100%">
28             <tr class="trDlg">
29                 <td valign="top" class="tdDlg" nowrap>对话</td>
30                 <td valign="top" class="tdDlg">
31                     <textarea id="tbxMsg" cols="255" rows="5" style="width: 100%"></textarea>
32                 </td>
33                 <td valign="top" class="tdDlg">
34                     <input id="btnSend" type="button" value="发送" disabled onclick="btnSend_onclick();" />
35                 </td>
36             </tr>
37         </table>
38     </div>
39 </div>
40 <div id="divRight">用户列表:</div>
41 </body>
42 </html>

 

静态css文件:

 1 h1{
 2     font-family: Arial,Helvetica,sans-serif;
 3     font-weight: bold;
 4     font-size: 14pt;
 5     color: #006bb5;
 6     background-color: #f0f0f0;
 7     border-radius: 5px;
 8     border: 1px solid #f0f0f0;
 9     padding: 5px;
10     margin: 0 0 18px 0;
11 }
12 div[id^=divContainer]{
13     border: 0;
14     margin: 10px 0;
15     padding: 3px;
16     background-color:#f0f0f0;
17     border-radius: 5px;
18 }
19 div#divLeft{
20     width: 85%;
21     background-color:#f0f0f0;
22     float: left;
23 }
24 div#divRight{
25     width: 15%;
26     background-color:white;
27     float: right;
28     font-weight: bold;
29     font-size: 12px;
30 }
31 div#divchat{
32     border: 0;
33     margin: 10px 0;
34     padding: 3px;
35     background-color:#f0f0f0;
36     border-radius: 5px;
37     position: relative;
38     height: 300px;
39     overflow: auto;
40     font-size: 12px;
41 }
42 table.tbDlg{
43     font-family:Verdana,Helvetica,sans-serif;
44     font-weight: normal;
45     font-size: 12px;
46     background-color: #f0f0f0;
47 }
48 tr.trDlg,td.tdDlg {
49     background-color: #f0f0f0;
50     font-size: 10px;
51 }
52  textarea{
53      font-family: inherit;
54      font-size: 10pt;
55      border:1px solid #444;
56      background-color:white;
57      width: 100%;
58 }
59  input[type="button"]{
60      font-family: inherit;
61      border: 1px solid #808080;
62      border-radius: 10px;
63      margin: 1px;
64      color: white;
65      background-color:#81a0b5;
66      width: 100px;
67  }
68 input[type="button"]:hover{
69     margin: 1px;
70     background-color: #006bb5;
71 }
72 input[type="button"]:active{
73     margin: 1px;
74     font-weight: bold;
75     background-color:#006bb5;
76 }
77 input[type="button"]:focus{
78     margin: 0;
79     font-weight: bold;
80     background-color:#006bb5;
81 }

 

 

静态js文件

 1 var userName,//用户登录到socket.io聊天室中时所使用的用户名
 2     socket,//与聊天服务器连接的socket端口对象
 3     tbxUsername,//用户名文本框
 4     tbxMsg,//对话文本框
 5     divChat;//页面中显示消息区域
 6 function window_onload(){
 7     divChat=document.getElementById("divchat");
 8     tbxUsername=document.getElementById("tbxUsername");
 9     tbxMsg=document.getElementById("tbxMsg");
10     tbxUsername.focus();
11     tbxUsername.select();
12 }
13 
14 function AddMsg(msg){
15     divChat.innerHTML+=msg+"<br>";
16     if(divChat.scrollHeight>divChat.clientHeight)
17         divChat.scrollTop=divChat.scrollHeight-divChat.clientHeight;
18 }
19 function btnLogin_onclick(){
20     if(tbxUsername.value.trim()==""){
21         alert("请输入用户名");
22         return;
23     }
24     userName=tbxUsername.value.trim();
25     socket=io.connect();
26     socket.on("connect",function(){
27         AddMsg("与聊天服务器的连接已建立.");
28         socket.on("login", function (name) {
29             AddMsg("欢迎用户"+name+"进入聊天室.");
30         });
31         socket.on("sendClients", function (names) {
32             var divRight=document.getElementById("divRight");
33             var str="";
34             names.forEach(function (name) {
35                 str+=name+"<br />";
36             });
37             divRight.innerHTML="用户列表<br />";
38             divRight.innerHTML+=str;
39         });
40         socket.on("chat", function (data) {
41             AddMsg(data.user+"说:"+data.msg);
42         });
43         socket.on("disconnect", function () {
44             AddMsg("与聊天服务器的连接已断开.");
45             document.getElementById("btnSend").diabled=true;
46             document.getElementById("btnLogout").disabled=true;
47             document.getElementById("btnLogin").disabled="";
48             var divRight=document.getElementById("divRight");
49             divRight.innerHTML="用户列表";
50         });
51         socket.on("logout", function (name) {
52             AddMsg("用户"+name+"已退出聊天室.")
53         });
54         socket.on("duplicate", function () {
55             alert("该用户名已被使用.");
56             document.getElementById("btnSend").disabled=true;
57             document.getElementById("btnLogout").disabled=true;
58             document.getElementById("btnLogin").disabled="";
59         });
60     });
61 
62     socket.on("error", function (err) {
63         AddMsg("与聊天服务器之间的链接发生错误.");
64         socket.disconnect();
65         socket.removeAllListeners("connect");
66         io.sockets={};
67     });
68     socket.emit("login",userName);
69     document.getElementById("btnSend").disabled="";
70     document.getElementById("btnLogout").disabled="";
71     document.getElementById("btnLogin").disabled=true;
72 }
73 
74 function btnSend_onclick(){
75     var msg=tbxMsg.value;
76     if(msg.length>0){
77         socket.emit("chat",{user:userName,msg:msg});
78         tbxMsg.value="";
79     }
80 }
81 function btnLogout_onclick(){
82     socket.emit("logout",userName);
83     socket.disconnect();
84     socket.removeAllListeners("connect");
85     io.sockets={};
86     AddMsg("用户"+userName+"退出聊天室:");
87     var divRight=document.getElementById("divRight");
88     divRight.innerHTML="用户列表";
89     document.getElementById("btnSend").disabled="disabled";
90     document.getElementById("btnLogout").disabled="disabled";
91     document.getElementById("btnLogin").disabled="";
92 }

最终界面

bubuko.com,布布扣

 

可以多开几个浏览器进行测试.这样效果更佳.

 

node+express+socket.io制作一个聊天室功能

标签:style   blog   http   ar   io   color   os   使用   sp   

原文地址:http://www.cnblogs.com/guoyansi19900907/p/4168261.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!