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

- 聊天

主要接口:
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