废话不多说,直接贴代码吧。注释很详细了。

服务端代码:

  1. /**
    * Created by LZX on 2015/10/7.
    */
    (function () {
    var d = document,
    w = window,
    p = parseInt,
    dd = d.documentElement,
    db = d.body,
    dc = d.compatMode == 'CSS1Compat',
    dx = dc ? dd: db,
    ec = encodeURIComponent;
  2.  
  3. window.CHAT = {
    msgObj:document.getElementById("message"),
    screenheight:window.innerHeight ? window.innerHeight : dx.clientHeight,
    username:null,
    userid:null,
    socket:null,
    //让浏览器滚动条保持在最低部
    scrollToBottom:function(){
    window.scrollTo(0, this.msgObj.clientHeight);
    },
    //退出,本例只是一个简单的刷新
    logout:function(){
    location.reload();
    },
    //提交聊天消息内容
    submit:function(){
    var content = document.getElementById("content").value;
    if(content != ''){
    var obj = {
    userid: this.userid,
    username: this.username,
    content: content
    };
    this.socket.emit('message', obj);
    document.getElementById("content").value = '';
    }
    return false;
    },
    genUid:function(){
    return new Date().getTime()+""+Math.floor(Math.random()*899+100);
    },
    //更新系统消息,本例中在用户加入、退出的时候调用
    updateSysMsg:function(o, action){
    //当前在线用户列表
    var onlineUsers = o.onlineUsers;
    //当前在线人数
    var onlineCount = o.onlineCount;
    //新加入用户的信息
    var user = o.user;
  4.  
  5. //更新在线人数
    var userhtml = '';
    var separator = '';
    for(key in onlineUsers) {
    if(onlineUsers.hasOwnProperty(key)){
    userhtml += separator+onlineUsers[key];
    separator = '、';
    }
    }
    document.getElementById("onlinecount").innerHTML = '当前共有 '+onlineCount+' 人在线,在线列表:'+userhtml;
  6.  
  7. //添加系统消息
    var html = '';
    html += '<div class="msg-system">';
    html += user.username;
    html += (action == 'login') ? ' 加入了聊天室' : ' 退出了聊天室';
    html += '</div>';
    var section = document.createElement('section');
    section.className = 'system J-mjrlinkWrap J-cutMsg';
    section.innerHTML = html;
    this.msgObj.appendChild(section);
    this.scrollToBottom();
    },
    //第一个界面用户提交用户名
    usernameSubmit:function(){
    var username = document.getElementById("username").value;
    if(username != ""){
    d.getElementById("username").value = '';
    d.getElementById("loginbox").style.display = 'none'; //隐藏掉名字输入框
    d.getElementById("chatbox").style.display = 'block';//显示出聊天界面
    this.init(username); //调用init方法
    }
    return false;
    },
    init:function(username){
    /*
    客户端根据时间和随机数生成uid,这样使得聊天室用户名称可以重复。
    */
    this.userid = this.genUid();
    //this.userid=username;
    this.username = username;
  8.  
  9. document.getElementById("showusername").innerHTML = this.username;
    this.msgObj.style.minHeight = (this.screenheight - document.body.clientHeight + this.msgObj.clientHeight) + "px";
    this.scrollToBottom();
  10.  
  11. //连接websocket后端服务器
    this.socket = io.connect('ws://localhost:3000');
  12.  
  13. //告诉服务器端有用户登录
    this.socket.emit('login', {userid:this.userid, username:this.username});
  14.  
  15. //监听新用户登录
    this.socket.on('login', function(o){
    CHAT.updateSysMsg(o, 'login');
    });
  16.  
  17. //监听用户退出
    this.socket.on('logout', function(o){
    CHAT.updateSysMsg(o, 'logout');
    });
  18.  
  19. //监听消息发送
    this.socket.on('message', function(obj){
    var isme = (obj.userid == CHAT.userid) ? true : false;
    var contentDiv = '<div>'+obj.content+'</div>';
    var usernameDiv = '<span>'+obj.username+'</span>';
  20.  
  21. var section = document.createElement('section');
    if(isme){
    section.className = 'user';
    section.innerHTML = contentDiv + usernameDiv;
    } else {
    section.className = 'service';
    section.innerHTML = usernameDiv + contentDiv;
    }
    CHAT.msgObj.appendChild(section);
    CHAT.scrollToBottom();
    });
  22.  
  23. }
    };
    //通过“回车”提交用户名
    document.getElementById("username").onkeydown = function(e) {
    e = e || event;
    if (e.keyCode === 13) {
    CHAT.usernameSubmit();
    }
    };
    //通过“回车”提交信息
    document.getElementById("content").onkeydown = function(e) {
    e = e || event;
    if (e.keyCode === 13) {
    CHAT.submit();
    }
    };
    })();
  1. 界面html代码这里就不放出来了。
  1. 客户端主要代码:
  1. /**
    * Created by LZX on 2015/10/7.
    */
    (function () {
    var d = document,
    w = window,
    p = parseInt,
    dd = d.documentElement,
    db = d.body,
    dc = d.compatMode == 'CSS1Compat',
    dx = dc ? dd: db,
    ec = encodeURIComponent;
  2.  
  3. window.CHAT = {
    msgObj:document.getElementById("message"),
    screenheight:window.innerHeight ? window.innerHeight : dx.clientHeight,
    username:null,
    userid:null,
    socket:null,
    //让浏览器滚动条保持在最低部
    scrollToBottom:function(){
    window.scrollTo(0, this.msgObj.clientHeight);
    },
    //退出,本例只是一个简单的刷新
    logout:function(){
    location.reload();
    },
    //提交聊天消息内容
    submit:function(){
    var content = document.getElementById("content").value;
    if(content != ''){
    var obj = {
    userid: this.userid,
    username: this.username,
    content: content
    };
    this.socket.emit('message', obj);
    document.getElementById("content").value = '';
    }
    return false;
    },
    genUid:function(){
    return new Date().getTime()+""+Math.floor(Math.random()*899+100);
    },
    //更新系统消息,本例中在用户加入、退出的时候调用
    updateSysMsg:function(o, action){
    //当前在线用户列表
    var onlineUsers = o.onlineUsers;
    //当前在线人数
    var onlineCount = o.onlineCount;
    //新加入用户的信息
    var user = o.user;
  4.  
  5. //更新在线人数
    var userhtml = '';
    var separator = '';
    for(key in onlineUsers) {
    if(onlineUsers.hasOwnProperty(key)){
    userhtml += separator+onlineUsers[key];
    separator = '、';
    }
    }
    document.getElementById("onlinecount").innerHTML = '当前共有 '+onlineCount+' 人在线,在线列表:'+userhtml;
  6.  
  7. //添加系统消息
    var html = '';
    html += '<div class="msg-system">';
    html += user.username;
    html += (action == 'login') ? ' 加入了聊天室' : ' 退出了聊天室';
    html += '</div>';
    var section = document.createElement('section');
    section.className = 'system J-mjrlinkWrap J-cutMsg';
    section.innerHTML = html;
    this.msgObj.appendChild(section);
    this.scrollToBottom();
    },
    //第一个界面用户提交用户名
    usernameSubmit:function(){
    var username = document.getElementById("username").value;
    if(username != ""){
    d.getElementById("username").value = '';
    d.getElementById("loginbox").style.display = 'none'; //隐藏掉名字输入框
    d.getElementById("chatbox").style.display = 'block';//显示出聊天界面
    this.init(username); //调用init方法
    }
    return false;
    },
    init:function(username){
    /*
    客户端根据时间和随机数生成uid,这样使得聊天室用户名称可以重复。
    */
    this.userid = this.genUid();
    //this.userid=username;
    this.username = username;
  8.  
  9. document.getElementById("showusername").innerHTML = this.username;
    this.msgObj.style.minHeight = (this.screenheight - document.body.clientHeight + this.msgObj.clientHeight) + "px";
    this.scrollToBottom();
  10.  
  11. //连接websocket后端服务器
    this.socket = io.connect('ws://localhost:3000');
  12.  
  13. //告诉服务器端有用户登录
    this.socket.emit('login', {userid:this.userid, username:this.username});
  14.  
  15. //监听新用户登录
    this.socket.on('login', function(o){
    CHAT.updateSysMsg(o, 'login');
    });
  16.  
  17. //监听用户退出
    this.socket.on('logout', function(o){
    CHAT.updateSysMsg(o, 'logout');
    });
  18.  
  19. //监听消息发送
    this.socket.on('message', function(obj){
    var isme = (obj.userid == CHAT.userid) ? true : false;
    var contentDiv = '<div>'+obj.content+'</div>';
    var usernameDiv = '<span>'+obj.username+'</span>';
  20.  
  21. var section = document.createElement('section');
    if(isme){
    section.className = 'user';
    section.innerHTML = contentDiv + usernameDiv;
    } else {
    section.className = 'service';
    section.innerHTML = usernameDiv + contentDiv;
    }
    CHAT.msgObj.appendChild(section);
    CHAT.scrollToBottom();
    });
  22.  
  23. }
    };
    //通过“回车”提交用户名
    document.getElementById("username").onkeydown = function(e) {
    e = e || event;
    if (e.keyCode === 13) {
    CHAT.usernameSubmit();
    }
    };
    //通过“回车”提交信息
    document.getElementById("content").onkeydown = function(e) {
    e = e || event;
    if (e.keyCode === 13) {
    CHAT.submit();
    }
    };
    })();
  1.  
  2. 最近贴两张运行效果图,毕竟没图没真相:
    先运行起来,服务端会提示监听3000端口

  1. 打开http://www.localhost:3000/

  1.  

输入名字进入聊天界面

  1. 再打开一个http://www.localhost:3000/模拟多个客户端

  1.  

  1. 开始聊天,小a、小b界面分别

  1.  

  1.  

  1.  
  1. 同时服务端也会有相应的提示消息

  1.  

  1.  
  1. 最后感谢http://www.plhwin.com/2014/05/28/nodejs-socketio/,这个项目也是看着前辈的搭出来的(抄袭仅仅是为了更快的消化,上手),能消化很不错了。不过有时间我会改进的,发送图片,表情,文件等功能后续都会完善。
    此系列会一直更新。
  2.  
  1.  

我的学习笔记之node----node.js+socket.io实时聊天(2)的更多相关文章

  1. 我的学习笔记之node----node.js+socket.io实时聊天(1) (谨此纪念博客开篇)

    本想着从hello word开篇,也确实写了相关学习笔记.各种原因吧,现在又着急写出作品,便作罢. 这里将记录一个node.js+socket.io的实时聊天程序.(当然我也是跟着网上各种教程资料学习 ...

  2. 我的学习笔记之node----node.js+socket.io实时聊天(1)

    本想着从hello word开篇,也确实写了相关学习笔记.各种原因吧,现在又着急写出作品,便作罢. 这里将记录一个node.js+socket.io的实时聊天程序.(当然我也是跟着网上各种教程资料学习 ...

  3. node.js + socket.io实现聊天室一

    前段时间,公司打算在社区做一个聊天室.决定让我来做.本小白第一次做聊天类功能,当时还想着通过ajax请求来实现.经过经理提示,说试试当前流行的node.js 和socket.io来做.于是就上网学习研 ...

  4. 转载:node.js socket.io

    本文转自:http://www.xiaocai.name/post/cf1f9_7b6507  学习node.js socket.io 使用 用node.js(socket.io)实现数据实时推送 在 ...

  5. 使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

  6. (转)使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

  7. 使用Node.js+Socket.IO搭建WebSocket实时应用【转载】

    原文:http://www.jianshu.com/p/d9b1273a93fd Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新 ...

  8. 基于node.js+socket.io+html5实现的斗地主游戏(1)概述

    一.游戏描述 说是斗地主游戏,其实是寝室自创的"捉双A",跟很多地方的捉红10.打红A差不多,大概规则是: 1.基础牌型和斗地主一样,但没有大小王,共52张牌,每人13张,这也是为 ...

  9. 用node.js(socket.io)实现数据实时推送

    在做商品拍卖的时候,要求在商品的拍卖页面需要实时的更新当前商品的最高价格.实现的方式有很多,比如: 1.setInterval每隔n秒去异步拉取数据(缺点:更新不够实时) 2. AJAX轮询方式方式推 ...

随机推荐

  1. 文字排版--粗体(font-weight)

    我们还可以使用css样式来改变文字的样式:粗体.斜体.下划线.删除线,可以使用下面代码实现设置文字以粗体样式显示出来. p span{font-weight:bold;} 在这里大家可以看到,如果想为 ...

  2. 微信小程序开发之入门篇(熟悉项目结构)

    微信小程序创建之后会生成一个项目模板,如下图所示(基本如此,但并不局限于此) 现在分别来说明一下每个文件及目录的意思 app.js 程序的入口文件,必须存在. app.js是小程序的脚本代码.我们可以 ...

  3. jdk配置环境变量(windows)

    1.配置环境变量:右击"我的电脑"-->"高级"-->"环境变量"1)在系统变量里新建"JAVA_HOME" ...

  4. smarty 的学习----ubuntu下初步配置

    转自:http://blog.csdn.net/ma332567575/article/details/7904124 首先去www.smarty.net下载最新版的Smarty 把下载后的压缩包在网 ...

  5. 简单的html5 File base64 图片上传

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. php基于数组的分页实现

    关于数组的分页函数,用数组进行分页的好处是可以方便的进行联合多表查询,只需要将查询的结果放在数组中就可以了以下是数组分页的函数,函数page_array用于数组的分页,函数show_array用于分页 ...

  7. windows 下 pgsql 拓展开启

    环境:windowxp + apache2.2+php5.2.13+postgresql8.3 操作步骤:1.修改php.ini,去掉“extension=php_pgsql.dll ”和“exten ...

  8. C#【数据库】 Excel打开到DataGridView

    if (openFileDialog1.ShowDialog() == DialogResult.OK) { Filename = openFileDialog1.FileName; string s ...

  9. python学习第五天 List和tuple类型介绍及其List切片

    List 和tuple: python提供一种类似C语言数组的类型,但是使用起来确是相当的简洁.那就讲讲这神奇的python中list 和tuple吧. List类型: 1.直接贴代码: L = [' ...

  10. WEB可用性、可访问性、可维护性

    可用性 (Usability) 可用性是一个多因素概念,涉及到容易学习.容易使用.系统的有效性.用户满意度,以及把这些因素与实际使用环境联系在一起针对特定目标的评价. 可访问性 (Accessibil ...