基于Nodejs的thinkjs简单聊天室实现
基于Nodejs的thinkjs简单聊天室实现
由于thinkjs内置了对websocket的支持,所以要实现聊天室的话非常简单。服务端代码也就50多行,当然功能比较简单。
Controller里的代码
module.exports = Controller(function(){
//websocket列表
var wsList = {};
setInterval(function(){
for(var id in wsList){
wsList[id].send({
name: '机器人',
text: '每隔10秒我就发一条消息哦'
})
}
}, 10000)
return {
indexAction: function(){
this.display();
},
/**
* 建立连接
* [@return](/user/return) {[type]} [description]
*/
openAction: function(){
var websocket = this.http.websocket;
var id = websocket.id;
for(var wid in wsList){
wsList[wid].send({
name: '系统',
text: 'id_' + id + '进入了聊天室'
});
}
wsList[id] = websocket;
this.http.on("websocket.close", function(){
console.log('close')
delete wsList[id];
for(var wid in wsList){
wsList[wid].send({
name: 'id_' + id,
text: 'goodbye~~'
});
}
})
},
/**
* 获取到消息
* [@return](/user/return) {[type]} [description]
*/
messageAction: function(){
var data = this.get();
data.name = 'id_' + this.http.websocket.id;
data.wslength = Object.keys(wsList).length;
//有消息后向所有人广播
for(var id in wsList){
wsList[id].send(data);
}
}
}
})
浏览器中的代码
$(function(){
var htmlMaps = {
'<': '<',
'>': '>',
'"': '"e;',
"'": '''
}
var escape_html = function (str) {
return (str + "").replace(/[<>'"]/g, function(a){
return htmlMaps[a];
})
}
function getWebSocket(){
var socket = new WebSocket("ws://" + location.hostname + ":1234/test/websocket/open");
var deferred = $.Deferred();
// 打开Socket
socket.onopen = function(event) {
$('<div class="alert alert-success">连接成功,开始聊天吧 ^_^</div>').appendTo(dataList);
deferred.resolve(socket);
// 监听消息
socket.onmessage = function(event) {
var data = JSON.parse(event.data).result;
console.log(data);
var html = '<div class="data-item"><span class="label label-primary">'+data.name+'</span> '
html += '<span>' + escape_html(data.text) + '</span></div>'
$(html).appendTo(dataList);
dataList[0].scrollTop = 100000000;
};
// 监听Socket的关闭
socket.onclose = function(event) {
socket = null;
console.log("websocket closed")
};
};
return deferred;
}
var ws = getWebSocket();
var dataList = $('.data-list');
var input = $('#textField').select();
$('#submitBtn').click(function(){
var value = input.val().trim();
if (!value) {
return input.focus();
};
ws.then(function(ws){
input.val('').focus();
ws.send(JSON.stringify({
jsonrpc: "2.0",
method: "/test/websocket/message",
params: {text: value},
id: 1
}))
})
})
})
基于Nodejs的ThinkJS简单聊天室实现
由于ThinkJS内置了对WebSocket的支持,因此实现一个简单的聊天室变得非常容易。本文将展示如何使用ThinkJS来构建一个基本的聊天室应用,包括服务端和客户端的代码。
服务端代码
首先,我们来看一下服务端的代码。ThinkJS内置了WebSocket支持,使得我们可以轻松地处理WebSocket连接和消息传递。
module.exports = Controller(function(){
// WebSocket列表
var wsList = {};
setInterval(function(){
for(var id in wsList){
wsList[id].send({
name: '机器人',
text: '每隔10秒我就发一条消息哦'
});
}
}, 10000);
return {
indexAction: function(){
this.display();
},
/**
* 建立连接
*/
openAction: function(){
var websocket = this.http.websocket;
var id = websocket.id;
// 广播新连接的消息
for(var wid in wsList){
wsList[wid].send({
name: '系统',
text: 'id_' + id + '进入了聊天室'
});
}
wsList[id] = websocket;
// 处理WebSocket关闭事件
this.http.on("websocket.close", function(){
console.log('close');
delete wsList[id];
// 广播断开连接的消息
for(var wid in wsList){
wsList[wid].send({
name: 'id_' + id,
text: 'goodbye~~'
});
}
});
},
/**
* 获取到消息
*/
messageAction: function(){
var data = this.get();
data.name = 'id_' + this.http.websocket.id;
data.wslength = Object.keys(wsList).length;
// 向所有连接的WebSocket广播消息
for(var id in wsList){
wsList[id].send(data);
}
}
}
});
客户端代码
接下来,我们来看一下客户端的代码。客户端主要负责建立WebSocket连接、发送和接收消息,并且将接收到的消息显示在页面上。
$(function(){
var htmlMaps = {
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
var escape_html = function (str) {
return (str + "").replace(/[<>'"]/g, function(a){
return htmlMaps[a];
});
};
function getWebSocket(){
var socket = new WebSocket("ws://" + location.hostname + ":1234/test/websocket/open");
var deferred = $.Deferred();
// 打开Socket
socket.onopen = function(event) {
$('div.alert-success').text('连接成功,开始聊天吧 ^_^').appendTo(dataList);
deferred.resolve(socket);
// 监听消息
socket.onmessage = function(event) {
var data = JSON.parse(event.data).result;
console.log(data);
var html = '<div class="data-item"><span class="label label-primary">' + data.name + '</span> ' +
'<span>' + escape_html(data.text) + '</span></div>';
$(html).appendTo(dataList);
dataList[0].scrollTop = 100000000;
};
// 监听Socket的关闭
socket.onclose = function(event) {
socket = null;
console.log("websocket closed");
};
};
return deferred;
}
var ws = getWebSocket();
var dataList = $('.data-list');
var input = $('#textField').select();
$('#submitBtn').click(function(){
var value = input.val().trim();
if (!value) {
return input.focus();
}
ws.then(function(ws){
input.val('').focus();
ws.send(JSON.stringify({
jsonrpc: "2.0",
method: "/test/websocket/message",
params: {text: value},
id: 1
}));
});
});
});
总结
通过上述代码,我们可以看到使用ThinkJS实现一个简单的聊天室是非常方便的。服务端主要处理WebSocket的连接、关闭以及消息广播,而客户端则负责与服务器进行通信并更新UI。这种方式不仅简洁高效,还能够满足基本的聊天需求。
基于ThinkJS框架的简单聊天室实现可以分为服务端和客户端两部分。ThinkJS内置了对WebSocket的支持,使得聊天室的实现相对简单。
服务端代码
服务端主要通过控制器处理WebSocket连接、消息发送以及连接关闭等操作。以下是服务端的关键代码:
module.exports = Controller(function() {
var wsList = {};
setInterval(function() {
for (var id in wsList) {
wsList[id].send({
name: '机器人',
text: '每隔10秒我就发一条消息哦'
});
}
}, 10000);
return {
indexAction: function() {
this.display();
},
openAction: function() {
var websocket = this.http.websocket;
var id = websocket.id;
for (var wid in wsList) {
wsList[wid].send({
name: '系统',
text: 'id_' + id + '进入了聊天室'
});
}
wsList[id] = websocket;
this.http.on("websocket.close", function() {
delete wsList[id];
for (var wid in wsList) {
wsList[wid].send({
name: 'id_' + id,
text: 'goodbye~~'
});
}
});
},
messageAction: function() {
var data = this.get();
data.name = 'id_' + this.http.websocket.id;
data.wslength = Object.keys(wsList).length;
for (var id in wsList) {
wsList[id].send(data);
}
}
};
});
客户端代码
客户端使用HTML和JavaScript来建立WebSocket连接,并处理消息接收和发送。以下是客户端的关键代码:
$(function() {
var htmlMaps = {
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
var escape_html = function(str) {
return (str + "").replace(/[<>"']/g, function(a) {
return htmlMaps[a];
});
};
function getWebSocket() {
var socket = new WebSocket("ws://" + location.hostname + ":1234/test/websocket/open");
var deferred = $.Deferred();
socket.onopen = function(event) {
$('div.alert-success').text('连接成功,开始聊天吧 ^_^').appendTo(dataList);
deferred.resolve(socket);
socket.onmessage = function(event) {
var data = JSON.parse(event.data).result;
var html = '<div class="data-item"><span class="label label-primary">' + data.name + '</span> ' + escape_html(data.text) + '</div>';
$(html).appendTo(dataList);
dataList[0].scrollTop = 100000000;
};
socket.onclose = function(event) {
socket = null;
console.log("websocket closed");
};
};
return deferred.promise();
}
var ws = getWebSocket();
var dataList = $('.data-list');
var input = $('#textField');
$('#submitBtn').click(function() {
var value = input.val().trim();
if (!value) {
return input.focus();
}
ws.then(function(ws) {
input.val('').focus();
ws.send(JSON.stringify({
jsonrpc: "2.0",
method: "/test/websocket/message",
params: {text: value},
id: 1
}));
});
});
});
以上代码展示了如何使用ThinkJS和WebSocket来实现一个简单的聊天室。服务端负责管理连接和广播消息,而客户端则负责与用户交互,显示消息并发送新的消息。