制作在线聊天室
文章目录
先上效果图:
- 登录

- 聊天

主要接口:
- join:用户加入聊天室 
- users: 发送用户列表 
- message: 发送聊天信息 
server 端主要代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | sockets.on('connection', function(socket) {
    var that = {};
    socket.on('join', function(user) {
        that = {
            user: user,
            socket: socket
        }
        socketList.push(that);
        sendUsers();
        sendMessage('系统信息', that.user + ' 加入聊天室!');
    });
    socket.on('message', function(message) {
        sendMessage(that.user, message);
    });
    socket.on('disconnect', function () {
        var index = socketList.indexOf(that);
        if (index !== -1) {
            socketList.splice(index, 1);
            sendUsers();
            sendMessage('系统信息', that.user + ' 离开聊天室!');
        }
    });
});
function sendUsers() {
    var users = [];
    socketList.forEach(function(socket) {
        users.push(socket.user);
    });
    socketList.forEach(function(socket) {
        socket.socket.emit('users', users);
    });
}
function sendMessage(user, info) {
    socketList.forEach(function(socket) {
        socket.socket.emit('message', {
            user: user,
            info: info
        });
    });
} | 
- connection 的时候,将 socket 和 user 存到变量 socketList 中 
- disconnect 的时候,将 socket 从 socketList 中移除 
html 主要代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <div class="container">
  <div class="login form-horizontal">
    <span>请输入你的姓名:</span>
    <input type="text" id="username" required="required" />
    <button id="startChat" class="btn">开始聊天</button>
  </div>
  <div class="main none">
    <ul id="users" class="nav nav-list span3"></ul>
    <div class="span8">
      <div id="room"></div>
      <div class="tr form-horizontal mt20">
        <input id="message" type="text" class="input-xxlarge" required="required" />
        <button id="sendMessage" class="btn btn-primary ml10">发送</button>
      </div>
    </div>
  </div>
</div> | 
- 首先显示 login 输入用户的姓名 
- 点击开始聊天后,显示聊天室界面 
js 主要代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | var socket = io.connect(location.origin);
socket.on('users', function(list) {
    var html = [];
    $.each(list, function(i, user) {
        html.push('<li>' + user + '</li>');
    });
    $('#users').html(html.join(''));
});
socket.on('message', function (data) {
    var $room = $('#room'),
        div = '<div>' + data.user + ' : ' + data.info + '</div>';
    if ($room[0].scrollTop + $room.height() >= $room[0].scrollHeight) {
        $room.append(div);
        $room.scrollTop($room[0].scrollHeight - $room.height());
    } else {
        $room.append(div);
    }
  });
function startChat() {
      var $username = $('#username'),
        username = $.trim($username.val());
      if (username === '') {
          $username.focus();
          return;
      }
      $('.login').hide();
      $('.main').show();
      socket.emit('join', username);
}
function sendMessage() {
      var $message = $('#message'),
        message = $.trim($message.val());
      if (message === '') {
          $message.focus();
          return;
      }
      $message.val('');
      socket.emit('message', message);
} | 
文章作者 wenzhixin
上次更新 2013-04-02