使用express4與socket.io搭建伺服器
阿新 • • 發佈:2018-12-16
首先安裝express4,參考http://www.expressjs.com.cn/starter/generator.html
npm install express-generator -g
然後建立express專案
express -e myapp
這樣就建立了一個基於ejs模板的express後臺服務專案. 接下來安裝soket.io
npm install socket.io --save
現在所需要的模組已經安裝好了,預設情況下express啟動後,監聽在3000埠,這裡是想將express和websocket都在80埠監聽,需要修改bin目錄下的www檔案,找到
/** * Module dependencies. */ var app = require('../app'); var debug = require('debug')('enlarge-server:server'); var http = require('http'); /** * Get port from environment and store in Express. */ var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * Create HTTP server. */ var server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ server.listen(port); server.on('error', onError); server.on('listening', onListening);
以上便是監聽邏輯,做以下修改即可達到目的:
#!/usr/bin/env node /** * Module dependencies. */ var app = require('../app'); var debug = require('debug')('enlarge-server:server'); var http = require('http'); /** * Get port from environment and store in Express. */ //修改埠為80 var port = normalizePort(process.env.PORT || '80'); app.set('port', port); /** * Create HTTP server. */ var server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ //websocket跟express繫結 var io = require('socket.io')(server); io.on('connection', function(socket) { //收到客戶端的websocket連線請求 console.log('connection:' + socket.request.connection.remoteAddress); socket.on('scan', function(data) { //...... }) }); server.listen(port); server.on('error', onError); server.on('listening', onListening);
這樣就修改好了.
這裡再分享一個http請求來了後跟websocket進行通訊的經驗,其實因為http和websocket是執行在同一個服務上,一般想的方法是在http請求來的時候拿到websocket連線物件然後傳送訊息給客戶端,很遺憾的是因為socket.io的繫結是在www下,而http一般是在router類來實現,請求來是拿不到相關連線物件,如果強制使用全域性物件來實現也不好維護和增加洩漏風險,遇到這種情況時可以使用另外一種辦法,就是在請求來時建立一個socket.io的客戶端請求來連線本地的websocket服務,示例如下:
// routers/connect.js var express = require('express'); var router = express.Router(); router.get('/', function (req, res, next) { res.writeHead(200, {'Content-Type': 'application/json'}); res.end("{ code: 'ok'}"); //連線本地服務 var io = require("socket.io-client"); let socket = io.connect("ws://localhost"); if (req.query.config != undefined && req.query.config != '') { console.log('redirect config:' + req.query.config); //傳送資料到指定事件 socket.emit('scan', JSON.parse(req.query.config)); } else { console.log('redirect config is empty'); } }); module.exports = router;