首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用节点http-proxy代理websocket连接

使用节点http-proxy代理websocket连接
EN

Stack Overflow用户
提问于 2014-02-07 22:03:13
回答 2查看 16.1K关注 0票数 15

我有一个通过socket.io使用websockets的应用程序。对于我的应用程序,我想使用一个单独的HTTP服务器来为我的应用程序提供静态内容和JavaScript。因此,我需要在适当的位置放置代理。

我正在使用node-http-proxy。作为起点,我的websockets应用程序在端口8081上运行。我使用以下代码将socket.io通信重定向到这个独立服务器,同时使用express提供静态内容:

代码语言:javascript
复制
var http = require('http'),
    httpProxy = require('http-proxy'),
    express = require('express');

// create a server
var app = express();
var proxy = httpProxy.createProxyServer({ ws: true });

// proxy HTTP GET / POST
app.get('/socket.io/*', function(req, res) {
  console.log("proxying GET request", req.url);
  proxy.web(req, res, { target: 'http://localhost:8081'});
});
app.post('/socket.io/*', function(req, res) {
  console.log("proxying POST request", req.url);
  proxy.web(req, res, { target: 'http://localhost:8081'});
});

// Proxy websockets
app.on('upgrade', function (req, socket, head) {
  console.log("proxying upgrade request", req.url);
  proxy.ws(req, socket, head);
});

// serve static content
app.use('/', express.static(__dirname + "/public"));

app.listen(8080);

上面的应用程序运行得很好,但是,我可以看到socket.io不再使用websockets,而是退回到XHR轮询。

我可以通过查看代理代码中的日志来确认:

代码语言:javascript
复制
proxying GET request /socket.io/1/?t=1391781619101
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
proxying POST request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=1391781629
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294
proxying GET request /socket.io/1/xhr-polling/f-VVzPcV-7_IKJJtl6VN?t=13917816294

有人知道如何代理web套接字通信吗?node-http-proxy中的所有示例都假设您希望代理所有流量,而不是代理一些流量并为另一些流量提供服务。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-24 17:14:35

只是偶然发现了你的问题,我看到它仍然没有得到回答。好吧,如果你还在寻找解决方案的话...您代码中的问题是,app.listen(8080)只是语法上的糖

代码语言:javascript
复制
require('http').createServer(app).listen(8080)

虽然Express本身只是一个处理程序函数,而不是httpServer的实例(我个人认为应该从app中删除此功能,以避免混淆)。因此,您的app.on('upgrade')实际上从未使用过。相反,您应该编写

代码语言:javascript
复制
var server = require('http').createServer(app);
server.on('upgrade', function (req, socket, head) {
  proxy.ws(req, socket, head);
});
server.listen(8080);

霍普,这有帮助。

票数 20
EN

Stack Overflow用户

发布于 2014-02-08 00:19:24

两台服务器都需要吗?如果没有,您可以对静态文件使用相同的服务器,并侦听套接字连接:

代码语言:javascript
复制
// make the http server
var express = require('express'),
    app = express(), server = require('http').createServer(app),
    io;

// serve static content
server.use('/', express.static(__dirname + '/public'));

server.listen(8080);

// listen for socket connections
io = require('socket.io').listen(server);

// socket stuff here
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21629752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档