Node js,从http服务器调用WebSocket服务器



我有一个节点js(express js支持)http应用程序。所以我有一个server.js文件如下(没有完整的代码)。

var app = require('./app/app');
var server = http.createServer(app);
server.listen(port, host);
server.on('error', onError);
server.on('listening', onListening);

后来我在那里添加了websocket服务器。现在就是这样。

// app server
var app = require('./app/app');
var server = http.createServer(app);
server.listen(port, host);
server.on('error', onError);
server.on('listening', onListening);
/**
 * websocker Server
 */
var WebSocket = require('ws');
var wsServer = http.createServer();
var url = require('url');
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({ server: wsServer });
var express = require('express');
var wsApp = express();
var port = 1337;
wsApp.use(function (req, res) {
    res.send({ msg: 'hello' });
});
wss.on('connection', function connection(ws) {
    console.log((new Date()) + ' Connection from origin ');
    ws.on('message', function incoming(message) {
        console.log('received: %s', message);
        var json = JSON.stringify({ type:'message', data: {hello : 'hello'} });
        ws.send(json);
    });
    var json = JSON.stringify({ type:'message', data: {hello : 'hello'} });
    ws.send(json);
});
wsServer.on('request', wsApp);
wsServer.listen(port, function () { console.log('Ws server Listening on ' + wsServer.address().port); });

现在这两个人工作得很愉快。我想要的是在对http服务器的POST调用中,我想要触发web套接字服务器向所有客户端广播一些内容。我的问题是如何从http服务器触发websocket服务器?http服务器的路由在app.js文件中定义。从那里我如何调用websocket服务器函数?

如果将ws功能封装在一个javascript文件(例如:websocket.js)中,则可以将websocket对象导出为模块。

module.exports = wss;

然后在您的http控制器中要求它

var wss = require(websocket.js)

在这种情况下,无论您喜欢在哪里使用wss.send({...})都应该很容易。

这种代码的平静对我来说很有效:

//websocket.js
'use strict';
var io = require('socket.io');
var callme;
function Websocket(server) {
    var server = io(server);
    server.on('connection', function(socket){
        console.log('Do something here');
    });
    callme = function (val) {
        //you my choose a specific cliente if you want, read the socket.io doc
        server.emit('I may emit it ' + val);
        console.log("Called " + val);
        return 'Somebody got it';
    }
}
Websocket.route = function(req, res, next) {
        if(typeof callme == 'function'){
            res.send(callme(req.param('t')));
        }else{
            res.send('Websocket server is not running');
        }
    };
module.exports = Websocket;

在快递应用程序的定义上,我放了

var Websocket = require('./websocket');
app.use('/blablabla', Websocket.route);

然后,在运行应用程序的服务器js文件上,我将

var server = http.createServer(app);
var s = new Websocket(server);

最后一行的工作方式类似于传统的io(服务器);会起作用。

之后,当您请求地址/babrabra时,路由将执行您的websocket方法。

我的解决方案尚未投入生产,如果有人出错,请告诉我。

最新更新