1. 程式人生 > >使用express4與socket.io搭建伺服器

使用express4與socket.io搭建伺服器

首先安裝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;