socket.io建立聊天系統
阿新 • • 發佈:2019-01-14
<>線上聊天系統<>
[service]
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function (req, res) {
res.sendFile(__dirname + '/socket_cli.html');
});
var onlineUserCount = 0; //客戶端連線數量
var onlineUsers = {}; //統計客戶端登入使用者
io.on('connection', function (socket) {
socket.emit('open'); //通知客戶端已連線
//構造客戶端物件
var client = {
socket: socket,
name: false
}
//監聽客戶端的chat message事件, 該事件由客戶端觸發
//當服務端收到訊息後,再把該訊息播放出去,繼續觸發chat message事件, 然後在客戶端監聽chat message事件。
socket.on('chat message', function (msg) {
console.log('chat message:' + msg);
var obj = { time: getTime() }; //構建客戶端返回的物件
//判斷是不是第一次連線,以第一條訊息作為暱稱
if (!client.name) {
onlineUserCount++;
client.name = msg;
obj['text'] = client.name;
obj['author'] = 'Sys';
obj['type'] = 'welcome';
obj['onlineUserCount' ] = onlineUserCount;
socket.name = client.name; //使用者登入後設置socket.name, 當退出時用該標識刪除該線上使用者
if (!onlineUsers.hasOwnProperty(client.name)) {
onlineUsers[client.name] = client.name;
}
obj['onlineUsers'] = onlineUsers; //當前線上使用者集合
console.log(client.name + ' login,當前線上人數:' + onlineUserCount);
//返回歡迎語
socket.emit('system', obj); //傳送給自己的訊息
//廣播新使用者已登入
socket.broadcast.emit('system', obj); //向其他使用者傳送訊息
} else {
//如果不是第一次聊天,則返回正常的聊天訊息
obj['text'] = msg;
obj['author'] = client.name;
obj['type'] = 'message';
console.log(client.name + ' say:' + msg);
socket.emit('chat message', obj); //傳送給自己的訊息 , 如果不想列印自己傳送的訊息,則註釋掉該句。
socket.broadcast.emit('chat message', obj); //向其他使用者傳送訊息
}
//io.emit('chat message',msg);
});
socket.on('disconnect', function () {
onlineUserCount--;
if (onlineUsers.hasOwnProperty(socket.name)) {
delete onlineUsers[client.name];
}
var obj = {
time: getTime(),
author: 'Sys',
text: client.name,
type: 'disconnect',
onlineUserCount: onlineUserCount,
onlineUsers: onlineUsers
};
//廣播使用者退出
socket.broadcast.emit('system', obj); //使用者登入和退出都使用system事件播報
console.log(client.name + ' disconnect,當前線上人數:' + onlineUserCount);
});
});
http.listen(3000, function () {
console.log('server begin...');
});
var getTime = function () {
var date = new Date();
return date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
}
var getColor = function () {
var colors = ['aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'pink', 'red', 'green',
'orange', 'blue', 'blueviolet', 'brown', 'burlywood', 'cadetblue'];
return colors[Math.round(Math.random() * 10000 % colors.length)];
}
[client]
<!doctype html>
<html>
<head>
<title>Socket.IO chat</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font: 13px Helvetica, Arial;
}
div {
background: #000;
padding: 3px;
position: fixed;
bottom: 0;
width: 100%;
}
div input {
border: 0;
padding: 10px;
width: 90%;
margin-right: .5%;
}
div button {
width: 9%;
background: rgb(130, 224, 255);
border: none;
padding: 10px;
}
#messages {
list-style-type: none;
margin: 0;
padding: 0;
}
#messages li {
padding: 5px 10px;
}
#messages li:nth-child(odd) {
background: #eee;
}
p {
padding: 5px 10px;
}
</style>
</head>
<body>
<p id="onlineUser">線上人數:0</p>
<ul id="messages"></ul>
<div action="">
<input id="m" autocomplete="off" />
<button>Send</button>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script type="text/javascript">
var myName = false;
var socket = io('http:/localhost:3000');
socket.on('open', function () {
$('#messages').append($('<li>').text('已連線至伺服器,請輸入暱稱'));
});
//監聽system事件,判斷welcome或者disconnect,列印系統訊息
socket.on('system', function (json) {
var sep = '';
var onlinehtml = '';
var onlineUsers = json.onlineUsers;
for (key in onlineUsers) {
if (onlineUsers.hasOwnProperty(key)) {
onlinehtml += sep + onlineUsers[key];
sep = '、';
}
}
if (json.type === 'welcome') {
$('#messages').append($('<li>').text('Sys(' + json.time + ')welcome ' + json.text));
$('#onlineUser').text('線上人數:' + json.onlineUserCount + '。線上列表:' + onlinehtml);
} else if (json.type === 'disconnect') {
$('#messages').append($('<li>').text('Sys(' + json.time + ')bye ' + json.text + ''));
$('#onlineUser').text('線上人數:' + json.onlineUserCount + '。線上列表:' + onlinehtml);
}
});
//監聽服務端的chat message事件,接受每一條訊息
socket.on('chat message', function (json) {
$('#messages').append($('<li>').text(json.author + '(' + json.time + ')' + ':' + json.text));
});
$('#m').keydown(function (e) {
if (e.keyCode === 13) {
socket.emit('chat message', $('#m').val());
//socket.send($('#m').val());
$('#m').val('');
if (myName === false) {
myName = $('#m').val();
}
}
})
</script>
</body>
</html>