我有一个节点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方法。
我的解决方案尚未投入生产,如果有人出错,请告诉我。