聊天室极简版(node.js)

拼搏现实的明天。 2022-06-02 04:40 299阅读 0赞

转载自:点击打开链接

跟着大神的脚步,实现了部分功能。

最终目录:

20180103174912870

index.html:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" href="css/index.css">
  7. </head>
  8. <body>
  9. <h1>主页</h1>
  10. <p>welcome <span id="uname"></span></p>
  11. <p id="p_title1"></p>
  12. <p id="user_count"></p>
  13. <div id="msgs">
  14. </div>
  15. <input type="text" id="send_msg">
  16. <button id="sendBtn">发送</button>
  17. <div id="loginWrapper">
  18. <p id="p_server">连接服务器中...</p>
  19. <p id="p_info"></p>
  20. <div id="login">
  21. <input type="text" id="input_nick">
  22. <button id="btn_login">登录</button>
  23. </div>
  24. <p id="login_tip"></p>
  25. </div>
  26. <script src="js/common.js"></script>
  27. <script src="js/socket.io.js"></script>
  28. <script src="js/chat.js"></script>
  29. <script>
  30. var socket=io.connect(),//与服务器进行连接
  31. button=document.getElementById('sendBtn');
  32. btn_login.οnclick=function(){
  33. socket.emit('foo', 'hello');//发送一个名为foo的事件,并且传递一个字符串数据‘hello’
  34. }
  35. </script>
  36. </body>
  37. </html>

index.css:

  1. #loginWrapper{
  2. position: absolute;
  3. top:0;
  4. left:0;
  5. width:100%;
  6. height:100%;
  7. background: rgba(5, 5, 5, .6);
  8. z-index:10;
  9. color: #FFF;
  10. }
  11. #login{
  12. display: none;
  13. }
  14. #msgs{
  15. width:50%;
  16. height:400px;
  17. border:1px solid #000;
  18. }

common.js:

  1. function getId(id){
  2. return document.getElementById(id);
  3. }

chat.js:

  1. /**
  2. * Created by web-01 on 2018/1/3.
  3. */
  4. window.οnlοad=function(){
  5. var chat=new Chat();
  6. chat.init();
  7. };
  8. var Chat=function(){
  9. this.socket=null;
  10. }
  11. Chat.prototype={
  12. init:function(){
  13. var that=this;
  14. //建立到服务器的socket连接
  15. this.socket=io.connect();
  16. //监听socket的connect事件,此事件表示连接已经建立
  17. this.socket.on('connect',function(){
  18. getId('p_server').style.display="none";
  19. getId('p_info').innerHTML="请输入用户名:";
  20. getId('login').style.display="block";
  21. getId('input_nick').focus();
  22. });
  23. btn_login.addEventListener('click',function(){
  24. var nickName=getId('input_nick').value;
  25. if(nickName.trim().length!=0){
  26. that.socket.emit('login',nickName);
  27. }else{
  28. getId('input_nick').focus();
  29. }
  30. },false);
  31. this.socket.on('nickExisted',function(){
  32. getId('login_tip').innerHTML="昵称已经被占用";
  33. });
  34. this.socket.on('loginSuccess',function(){
  35. getId("uname").innerHTML=getId("input_nick").value;
  36. getId("loginWrapper").style.display="none";
  37. getId("send_msg").focus();
  38. });
  39. this.socket.on('system',function(nickName,userCount,type){
  40. var msg=nickName+(type=='login'?'joined':'leave');
  41. that._displayNewMsg('system',msg);
  42. getId("p_title1").innerHTML=msg;
  43. getId("user_count").innerHTML=userCount+(userCount>1?'users':'user')+' online';
  44. });
  45. sendBtn.addEventListener('click',function(){
  46. var messageInput=getId("send_msg"),
  47. msg=messageInput.value;
  48. messageInput.value='';
  49. messageInput.focus();
  50. if(msg.trim().length!=0){
  51. that.socket.emit('postMsg',msg);
  52. that._displayNewMsg('me',msg);
  53. }
  54. },false);
  55. this.socket.on('newMsg',function(user,msg){
  56. that._displayNewMsg(user,msg);
  57. })
  58. },
  59. _displayNewMsg:function(user,msg){
  60. var container=getId("msgs"),
  61. msgToDisplay=document.createElement('p'),
  62. date=new Date().toTimeString().substr(0,8);
  63. msgToDisplay.innerHTML=user+'<span>('+date+'):</span>'+msg;
  64. container.appendChild(msgToDisplay);
  65. container.scrollTop=container.scrollHeight;
  66. }
  67. };

server.js:

  1. /**
  2. * Created by web-01 on 2018/1/3.
  3. */
  4. var http=require('http');
  5. var server=http.createServer(function(req,res){
  6. res.writeHead(200,{
  7. 'Content-Type':'text/plain'
  8. });
  9. res.write('hello world!');
  10. res.end();
  11. });
  12. var express=require('express'),
  13. app=express(),
  14. server=require('http').createServer(app);
  15. app.use('/',express.static(__dirname+'/www'));
  16. server.listen(80);
  17. var io=require("socket.io").listen(server);
  18. var users=[];
  19. io.on('connection',function(socket){
  20. socket.on('foo',function(data){
  21. console.log(data);
  22. });
  23. socket.on('login',function(nickname){
  24. if(users.indexOf(nickname)>-1){
  25. socket.emit('nickExisted');
  26. }else{
  27. socket.userIndex=users.length;
  28. socket.nickname=nickname;
  29. users.push(nickname);
  30. socket.emit("loginSuccess");
  31. io.sockets.emit("system",nickname,users.length,'login');
  32. console.log("loginSuccess");
  33. }
  34. });
  35. socket.on('disconnect',function(){
  36. //将断开连接的用户从users中删除
  37. users.splice(socket.userIndex,1);
  38. //通知除自己以外的所有人
  39. socket.broadcast.emit('system',socket.nickname,users.length,'logout');
  40. });
  41. socket.on('postMsg',function(msg){
  42. //将消息发送到除自己外的所有用户
  43. socket.broadcast.emit('newMsg',socket.nickname,msg);
  44. });
  45. });
  46. console.log('server started');

效果图:

20180103175335008

注意:

可以去参考博客看完整实现(可以发图片和表情等)。

发表评论

表情:
评论列表 (有 0 条评论,299人围观)

还没有评论,来说两句吧...

相关阅读

    相关 NodeJS聊天

      跟着教学视频了解到websocket和socket.io的通信方法之后,自己写了一个交互效果更好的聊天室。   ▍小插曲 2019.1.24:今天在聊天室后台无意间