nodejs即时聊天

一直想做一个即时聊天的应用,前几天看到了socket.io,感觉还不错,自己略加修改,感觉挺不错的。官网上给的例子很简单,下面改进了一点,实现了历史消息的推送。

demo地址:chat.androiddevelop.cn

其中服务器端代码:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var history = new Array();

app.get('/', function(req, res){
  res.sendfile('chat.html');
});

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    io.emit('chat message', msg);
    addMsg(msg);
  });

  socket.on('login message', function(msg){
    socket.join('history room');
    for(var i=0;i<history.length;i++){
      io.in('history room').emit('chat message', history[i]);
   }
      io.in('history room').emit('chat message', 'lyd__上面是最近的一些信息');
    socket.leave('history room');
    socket.join('chat room'); 

    io.emit('chat message',msg);
    addMsg(msg);
  });
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});

function addMsg(msg){
 history.push(msg);
 if(history.length>100)
    history.shift();
};

聊天页面代码:

<!doctype html>
<html>
  <head>
    <title>聊天室</title>
    <style>
      * { margin: 0; padding: 0; box-sizing: border-box; }
      body { font: 20px Helvetica, Arial; }
      form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
      form input { border: 0; padding: 10px; width: 90%;  }
      form button { width: 10%; background: rgb(130, 224, 255); border: none;  padding: 10px; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages li { padding: 5px 10px 5px 10px; }
    </style>
  </head>
  <body>
    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button id="btn">登录</button>
    </form>
    <script src="/socket.io/socket.io.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
    <script>
      var socket = io();
      var login  =true;
      var username = "" ;
      var myDate = new Date();
      $('form').submit(function(){
         if(login){
           username = $('#m').val();
           if(username.length==0){
               alert("请输入用户名");
               return false;
            }
           login = false ;
           socket.emit('login message', "lyd__<font color=blue>"+username + '</font>加入了聊天室   '+myDate.getMonth()+"-"+myDate.getDate()+" "+myDate.getHours()+":"+myDate.getMinutes()+":"+myDate.getSeconds());
           $('#btn').html("发送");
         }else {
           socket.emit('chat message', username +"##"+ $('#m').val());
        }
         $('#m').val('');
        return false;
      });
        socket.on('chat message', function(msg){
        var item = msg.split("##",2);
        if(msg.indexOf('lyd__')==0)
          $('#messages').append('<li style="text-align:center; font-size:12px;margin-top:1px; color:red; background-color:#eee;">' +msg.substr(5)+'</li>');
        else if(msg.indexOf(username)==0){
          $('#messages').append('<li style="text-align:right; font-size:12px; color:red;">'+item[0]+':</li>');
          $('#messages').append('<li style="text-align:right;padding-top:0px; padding-left:30%;color:purple;">'+item[1]+'</li>');
        }else {
          $('#messages').append('<li style="text-align:left;font-size:12px; color:red;">'+item[0]+':</li>');
          $('#messages').append('<li style="text-align:left;padding-top:0px; padding-right:30%; color:purple;">'+item[1]+'</li>');
        }
      });
    </script>
  </body>
</html>

这样就实现了一个聊天室,进入后输入用户名,登录,之后服务器返回最近的100条消息。

时间: 2024-08-06 03:22:09

nodejs即时聊天的相关文章

Node.js+websocket+mongodb实现即时聊天室

ChatRoom Node.js+websocket+mongodb实现即时聊天室 A,nodejs简介:Node.js是一个可以让javascript运行在服务器端的平台,它可以让javascript脱离浏览器的束缚运行在一般的服务器下面,你可以用Node.js轻松地进行服务器端应用的开发.Node.js是一个为实时Web应用开发而诞生的平台,它充分考虑了在实时响应和超大规模数据下架构的可扩展性,这使得它摒弃了传统的平台依靠多线程来实现高并发的的设计思路,而采用了单线程,异步式I/O和事件驱动

php+ajax长轮询实现web即时聊天

web im的实现方式有很多种: 1.普通轮询,原理通过js定时重复发送ajax请求服务端,获取数据后显示. 2.长轮询,ajax请求服务端,服务端有数据会立即返回,服务端无数据时,会一直等待,直到有数据了才立即范围. 3.socket长连接. 特征分析: 方法1:实现起来最容易,定时重复请求服务端会产生无意义的http连接,消耗服务端资源,实时性较差. 方法2:实现起来较容易,会减少无效的ajax请求产生的http连接,能即时返回数据,但服务端会一直挂着,会消耗一定的资源,处理并发能力不强,比

高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输入时显示一个提示字符串.由于Background对ComboBox无效,所以直接通过Background来实现是不行了.需要重新写ComboBox的模板,也就是Template,自定义一个模板来实现这个结果.又看了一下QQ的下拉框,这玩意不自定义也难以实现,所以就干脆自定义了. 先上代码,先是Com

nodejs websocket 聊天应用

前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前后端之间代码敲得飞起,从此由前端晋升为'前后端'. 图片来自G+ 本文将使用Node.js加web socket协议打造一个网页即时聊天程序,取名为HiChat,中文翻过来就是'嗨聊',听中文名有点像是专为寂寞单身男女打造的~ 其中将会使用到express和socket.io两个包模块,下面会有介绍

ios开发xmpp仿微信即时聊天工具

最近在做一个项目,需要一个即时聊天工具,先打算有第三方环信(http://www.easemob.com),但是最终老板不允许,要自己开发用自己的服务器,哎!如果有需要的可以去看看这个环信,真的不错.进入今天的主题,其实也是大神们开发的,我在这只是把一些细节理一下让大家你能少走一点弯路,需要的资料和源码这里面都有http://pan.baidu.com/s/1nt5esnn. 详细的介绍看这http://blog.csdn.net/kangx6/article/details/7740135,看

高仿QQ即时聊天软件开发系列之二登录窗口界面

继上一篇高仿QQ即时聊天软件开发系列之一开端之后,开始做登录窗口 废话不多说,先看效果,只有界面 可能还有一些细节地方没有做,例如那个LOGO嘛,不要在意这些细节 GIF虽短,可是这做起来真难,好吧因为我没玩过WPF所以难,因为感觉做出来之后也就那样 整体布局 整体是上下分,下面是左中右分 1 <Grid> 2 <Grid.RowDefinitions> 3 <RowDefinition Height="27"><!--用于放窗口右上角关闭.最

ajax长轮询实现即时聊天室

前段js: //处理ajax长轮询 $(function(){ ask_order(); function ask_order(){ var ask_action = "{:U('index/order_commet',array('time'=>10,'desk_id'=>$desk_id))}"; $.ajax({                    type:"GET",                    dataType:"jso

iOS通过SocketRocket实现websocket的即时聊天

之前公司的即时聊天用的是常轮循,一直都觉得很不科学,最近后台说配置好了socket服务器,我高兴地准备用asyncsocket,但是告诉我要用websocket,基于HTML5的,HTML5中提出了一种新的双向通信协议--WebSocket,本文尝试采用这种技术来实现以上的实时聊天功能. 在搜索了很多资料后,用square大神的SocketRocket进行实现,会比较简单,同时URL和端口,发送消息参数需要和后台约定好. 首先pod导入SocketRocket platform :ios, '7

Dollars即时聊天客户端应用源码

这个源码项目是一款Dollars即时聊天客户端应用源码,源码也比较简单的,希望这个案例能够帮到大家的学习和使用. 源码下载: http://code.662p.com/view/6725.html     An Instant Message Client by XMPP on iPhone使用XMPP实现的iPhone上的聊天工具.只完成了一小部分功能. 登录和注册; 获取联系人列表; 添加好友; 接受好友; 与好友聊天; 获取多人聊天房间列表; 加入房间; 房间内多人聊天; 修改个人状态;目