閱讀本文前……
建議訪問(wèn)http://socket.io/get-started/chat/先大致了解如何構(gòu)建一個(gè)基于Node.js+express+socket.io的簡(jiǎn)易聊天室之后再閱讀本文。
最近做網(wǎng)絡(luò)項(xiàng)目開(kāi)發(fā)的時(shí)候需要使用到Socket.io,網(wǎng)站使用的是express4搭建的。如何將和Socket.io相關(guān)的代碼分離,網(wǎng)上的資料比較少,http://socket.io/get-started/chat/這個(gè)頁(yè)面上的樣例將所有代碼混雜在一起,并不適合在開(kāi)發(fā)中使用。我在這里先提供一個(gè)思路。
待解決的問(wèn)題
- Socket.io的配置代碼如何從express自動(dòng)生成項(xiàng)目中分離
- 支持Socket.io的功能插件如何從Socket.io的配置代碼中分離
首先用express-generator生成express4項(xiàng)目。并且用npm在項(xiàng)目中安裝socket.io。項(xiàng)目文件夾的結(jié)構(gòu)如下
bin/
www
model/
chatcore.js
node_modules/
public/
routes/
index.js
views/
chatroom/
chat.pug
app.js
socketio.js
package.js
Socket.io的封裝
第一步,新建socketio.js,將socketio相關(guān)配置寫(xiě)入
// socketio.js
var socketio = {};
var socket_io = require('socket.io');
//獲取io
socketio.getSocketio = function(server){
var io = socket_io.listen(server);
};
module.exports = socketio;
第二步,修改bin/www,啟動(dòng)服務(wù)器端服務(wù)
// bin/www
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('chatroom:server');
var http = require('http');
// 添加此段內(nèi)容以引入socketio
var io = require('../socketio');
// ...
/**
* Create HTTP server.
*/
var server = http.createServer(app);
// 添加此段內(nèi)容啟動(dòng) Socket.io
io.getSocketio(server);
// ...
此時(shí)前端頁(yè)面可從http://localhost:3000/socket.io/socket.io.js加載前端部分的socketio代碼,前端內(nèi)容可以參照http://socket.io/get-started/chat/創(chuàng)建。
啟動(dòng)基于Socket.io的服務(wù)(以聊天室為例)
這里只講解后臺(tái)部分的代碼。
假如我們需要啟動(dòng)一個(gè)簡(jiǎn)易聊天室服務(wù),我們可以把聊天室的業(yè)務(wù)放在socketio.js當(dāng)中(雖然這不是一個(gè)好主意):
// socketio.js
var socketio = {};
var socket_io = require('socket.io');
//獲取io
socketio.getSocketio = function(server){
var io = socket_io.listen(server);
// 聊天室
// 從http://socket.io/get-started/chat/上尋求更多幫助
io.on('connection', function(socket) {
console.log('a user connected');
socket.on('chat message', function(msg){
io.emit('chat message', msg);
});
socket.on('disconnect', function(){
console.log('user disconnected');
});
});
};
module.exports = socketio;
分離聊天室業(yè)務(wù)和socket.io配置
下面將聊天室業(yè)務(wù)代碼分離,在model/(如果沒(méi)有的話(huà)就新建一個(gè))下創(chuàng)建chatcore.js,并加入如下內(nèi)容:
// model/chatcore.js
var chatcore = {};
/**
* chatroom app
*/
chatcore.init = function(io) {
io.on('connection', function(socket) {
console.log('a user connected');
socket.on('chat message', function(msg){
io.emit('chat message', msg);
});
socket.on('disconnect', function(){
console.log('user disconnected');
});
});
};
module.exports = chatcore;
將socketio.js修改為:
// socketio.js
var socketio = {};
var socket_io = require('socket.io');
var chatcore = require('./model/chatcore');
//獲取io
socketio.getSocketio = function(server){
var io = socket_io.listen(server);
// Start chatroom app
chatcore.init(io);
};
module.exports = socketio;
如果有更多的應(yīng)用模塊,可以以相同的方式安排代碼。
歡迎討論。