2016-04-16 14 views
7

Ich muss Websocket auf Anwendungsebene ausgleichen. Lassen Sie uns die Websocket-Anfrage auf der Grundlage der erhaltenen Nachricht weiterleiten, sie auf dem Proxy decodieren und dann diese Daten an einen anderen Socket-Server senden, indem Sie eine Logik verwenden.Knoten Http Proxy Web Socket Balance

Aber ich bin nicht in der Lage, dies zu tun. Dies ist der ursprüngliche Code, den ich geschrieben habe und versuche, das zu tun. Dies ist der Server

var http = require('http'); 
var httpProxy = require('http-proxy'); 
var WebSocket = require('ws'); 

var WebSocketServer = require('ws').Server; 
var wss = new WebSocketServer({ port: 8080 }); 

wss.on('connection', function connection(ws) { 
    ws.on('message', function incoming(message) { 
     console.log('received: %s', message); 
    }); 
    ws.send('something'); 
}); 

var proxy = httpProxy.createServer({target: 'ws://localhost:8080', ws:true}); 


var server = httpProxy.createServer(function(req, res) { 
    //SOME LOGIC HERE TO PARSE WS DATA AND SEND TO WS SERVER 
    proxy.ws(req, res, { target: 'ws://localhost:8080'}); 
}).listen(8014); 

CLIENT

var http = require('http'); 
var httpProxy = require('http-proxy'); 
var WebSocket = require('ws'); 


var ws = new WebSocket('ws://localhost:8014/'); 

ws.on('open', function() { 
    ws.send("CLIENT"); 
}); 

ws.on('message', function (msg) { 
    console.log(msg); 
}); 
+0

möglich [duplizieren] (http://stackoverflow.com/questions/21629752/using-node-http-proxy-to-proxy-websocket-connections)? Könnte dir helfen –

+0

@NiCkNewman Ich kann Proxy-fein, aber ich muss auf der Grundlage der empfangenen Daten ausgleichen, ohne tatsächlich die Socket-Verbindung zu brechen. –

Antwort

2

Hier ist ein Beispiel. In diesem Fall verbindet sich der Client direkt mit uter.js, die dann Verbindungen zu Upstream-Servern (inner.js) weiterleitet.

outer.js

var http = require('http'); 
var httpProxy = require('http-proxy'); 

var proxies = { 
    foo: new httpProxy.createProxyServer({ 
    target: { 
     host: "foo.com", 
     port: 8080 
    } 
    }), 
    bar: new httpProxy.createProxyServer({ 
    target: { 
     host: "bar.com", 
     port: 8080 
    } 
    }) 
    // extend this... 
}; 

var findUpstream = function(req){ 
    // TODO return key for lookup in @proxies 
}; 

var proxyServer = http.createServer(function (req, res){ 
    var upstream = findUpstream(req); 
    proxies[upstream].web(req, res); 
}); 

proxyServer.on('upgrade', function (req, socket, head) { 
    var upstream = findUpstream(req); 
    proxies[upstream].ws(req, socket, head); 
}); 

proxyServer.listen(8014); 

inner.js

var WebSocketServer = require('ws').Server; 
var wss = new WebSocketServer({ port: 8080 }); 

wss.on('connection', function connection(ws) { 
    ws.on('message', function incoming(message) { 
     console.log('received: %s', message); 
    }); 
    ws.send('something'); 
}); 

In diesem Beispiel werden Sie in der findUpstream füllen müssen den Schlüssel wie foo oder bar Basis zurückzukehren auf Daten in der Anfrage. Es wäre auch eine Fehlerbehandlung sinnvoll, wenn der richtige Upstream-Server nicht gefunden wird, aber dies sollte die allgemeine Idee veranschaulichen.