基于Node.js,Express,Socket.io创建简单聊天室
首先看服务器端:
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var port = process.env.PORT || 3030;
server.listen(port, function () {
console.log('server listening at port %d', port);
});
app.use(express.static(__dirname + '/public'));
var io = require('socket.io').listen(server);
var namelist = [];
io.on('connection', function (socket) {
console.log('user connected');
socket.emit('welcome', {text: 'connected'});
socket.on('name', function (data, callback) {
if (namelist.indexOf(data) === -1) {
callback(true);
namelist.push(data);
socket.uname = data;
console.log('昵称:' + namelist);
io.sockets.emit('usernames', namelist);
}
else {
callback(false);
}
});
socket.on('disconnect', function () {
if (!socket.uname) return;
if (namelist.indexOf(socket.uname) > -1) {
namelist.splice(namelist.indexOf(socket.uname), 1);
}
console.log('昵称:' + namelist);
io.sockets.emit('usernames', namelist);
});
socket.on('message', function (data) {
io.sockets.emit('sendmessage', {senduser: socket.uname, message: data});
});
});
页面逻辑处理:
var socket = io.connect('http://127.0.0.1:3030');
socket.on('welcome', function (data) {
console.log(data.text);
});
var doc = document,
uname = doc.getElementById('uname'),
addname = doc.getElementById('addname'),
list = doc.getElementById('namelist'),
message = doc.getElementById('message'),
sendmessage = doc.getElementById('addmessage'),
showmessage = doc.getElementById('show');
addname.onsubmit = function () {
if (uname.value === "") {
alert("昵称不能为空!");
return false;
}
socket.emit('name', uname.value, function (data) {
if (data) {
console.log('successfully');
addname.style.display = "none";
sendmessage.style.display = "block";
}
else {
alert('昵称已存在');
}
});
return false;
};
socket.on('usernames', function (data) {
var html = '';
for (var i = 0; i < data.length; i++) {
html += '<li>' + data[i] + '</li>';
}
list.innerHTML = html;
});
sendmessage.onsubmit = function () {
if (message.value === "") {
alert("消息不能为空!");
} else {
socket.emit('message', message.value);
message.value = "";
}
return false;
};
socket.on('sendmessage', function (data) {
var elem = doc.createElement('p');
var txt = doc.createTextNode(data.senduser + ':' + data.message);
elem.appendChild(txt);
showmessage.appendChild(elem);
});
主页html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用socket.io和express创建一个聊天工具</title>
<link rel="stylesheet" href="style.css"/>
<style>
</style>
</head>
<body>
<div id="content">
<div id="show"></div>
<div id="showlist">
<ul id="namelist"></ul>
</div>
<div id="clear"></div>
<form action="#" id="addname">
<label for="uname">昵称:</label>
<input type="text" id="uname" class="input"/>
<input type="submit" value="添加昵称" class="btn"/>
</form>
<form action="#" id="addmessage">
<label for="message">消息:</label>
<input type="text" id="message" class="input"/>
<input type="submit" value="发送消息" class="btn"/>
</form>
</div>
<script src="/socket.io/socket.io.js"></script>
<script src="main.js"></script>
</body>
</html>
css:
* {
margin: 0;
padding: 0;
font-family: "Microsoft YaHei UI";
font-size: medium;
}
#content {
width: 80%;
height: 500px;
margin: 20px auto;
background-color: aliceblue;
border-radius: 10px;
padding: 20px;
border: 1px dashed black;
position: relative;
}
#show {
float: left;
width: 50%;
height: 400px;
border: 1px solid black;
}
#showlist {
overflow: hidden;
padding-left: 40px;
}
#clear {
clear: both;
}
#addmessage {
display: none;
}
#addmessage, #addname {
width: 100%;
text-align: center;
position: absolute;
bottom: 30px;
}
.input, .btn {
height: 30px;
border: none;
border-radius: 3px;
}
.input {
width: 300px;
}
.btn {
width: 100px;
}