Socket.io-client: 使用命名空间将忽略端口,或默认为端口 80

创建于 2015-02-03  ·  56评论  ·  资料来源: socketio/socket.io-client

怎么了:

我在端口 4040 上运行了 socket.io 服务(例如),它公开了命名空间/chat 。 从客户端,如果我尝试连接到命名空间而不指定完整的 url, window url 将在没有端口的情况下使用(或默认为端口 80)。

什么工作:

从客户端,连接到默认命名空间仍然可以,例如io.connect()io()将正确连接完整的 url 192.168.0.149:4040 。 不用说完整的网址有效。

复制代码

# app.coffee
express = require 'express'
io = require 'socket.io'
http = require 'http'
app = express()
server = http.createServer(app)
io = io.listen server

server.listen 4040

app.use(express.static "#{__dirname}/public")

chat = io.of 'chat'

chat.on 'connection', (socket) ->
  socket.emit 'welcome', 'howdy'

# index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Chat with port demo</title>
  </head>
  <body>
    <h1>Chat ip demo</h1>
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io('/chat');
      socket.once('welcome', function (message) {
        console.log(message);
      });
    </script>
  </body>
</html>

# package.json
{
  "name": "socdemo",
  "version": "1.0.0",
  "description": "",
  "main": "app.coffee",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.11.2",
    "socket.io": "^1.3.2"
  }
}

# error (misleading error since it's because there is nothing running on 192.168.0.149:80)
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://192.168.0.149/socket.io/?EIO=3&transport=polling&t=1422967677888-0. This can be fixed by moving the resource to the same domain or enabling CORS.

最有用的评论

已在 1.4.x 中修复。

所有56条评论

这看起来已由 #803 修复。 虽然还没有发布。

这还没有修复。 现在,当尝试连接到与 80 不同的端口上的命名空间时,您会收到以下错误:

 GET http://localhost/socket.io/?EIO=3&transport=polling&t=1423870326340-9 net::ERR_CONNECTION_REFUSED
(index):24 Error connecting Error: xhr poll error {type: "TransportError", description: 0, stack: (...), message: "xhr poll error"}

重现代码:
应用程序.js:

var http = require('http'),
    fs = require('fs'),
    index = fs.readFileSync(__dirname + '/index.html');

    // Send index.html to all requests
    var app = http.createServer(function(req, res) {
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.end(index);
    });

    // Socket.io server listens to our app
    var io = require('socket.io').listen(app);

    io.sockets.on('connection', function(socket) {
        console.log("Connected");
    });

    var auth = io.of('/test').use(function(socket, next){
        console.log("Authenticating...")
        next();
    }); 

    auth.on('connection', function(socket){
        console.log("Connected to namespace /test");
        socket.emit('welcome', { message: new Date().toJSON() });
        socket.on('i am client', console.log);
    })

    function sendTime() {
        io.of('/test').emit('time', { time: new Date().toJSON() });
    }

    setInterval(sendTime, 100);

app.listen(8088);

索引.html:

<!doctype html>
<html>
    <head>
        <script src='/socket.io/socket.io.js'></script>
        <script>
            var socket = io.connect('http://localhost:8088/test', {
                timeout: 3000
            });

            socket.on('welcome', function(data) {
                document.getElementById("start").innerHTML = data.message
                socket.emit('i am client', {data: 'foo!'});
            });
            socket.on('time', function(data) {
                document.getElementById("end").innerHTML =  data.time;
            });
            socket.on('message', function() { console.log(arguments) });

            socket.on('error', function(err){
                console.log("Error:", err);
            })

            socket.on('connect_error', function(err){
                console.log("Error connecting", err);
            })
        </script>
    </head>
    <body>
        <p id='start'></p>
        <p id='end'></p>
    </body>
</html>

@manast我认为只有在使用没有主机的相对路径时才会出现这个问题。 你的意思是还有一个问题?

我不知道这是一个不同的问题还是比最初预期的更复杂的问题。 但是,如果您针对 master 测试我在上面粘贴的代码,您将很容易重现。 只需将端口更改为 80 即可。

@manast我无法重现它。 请问master的源码是怎么安装的?

"socket.io": "Automattic/socket.io#a93d05a9f3f3b9697abc922163980f5788f9c6fb"

以上是我对package.json的设置。

哦,对不起,你是对的,示例代码正在与当前的主人一起工作。 但是如果你改变线

var socket = io.connect('http://localhost:8088/test', {

var socket = io.connect('/test', {

那么你会得到我上面报告的错误。

@manast我相信错误是因为socket.io.js还旧(没问题)。 如果你想尝试,你可以make build来更新它。

似乎我发布的原始问题在 1.3.4 中仍未修复。

@nlhkh是的,它还没有发布。

当使用非标准端口(例如 8000)时, http: //socket.io/docs/ 上的基本示例在 Chrome 和 Firefox 上失败。客户端尝试连接到服务器,但忽略了该端口。

预期的:
http://localhost :8000/socket.io/?EIO=3&transport=polling&t=1424145292759-2

实际的:
http://localhost/socket.io/?EIO=3&transport=polling&t=1424145292759-2

跨域请求被阻止:同源策略不允许读取位于 这可以通过将资源移动到同一域或启用 CORS 来解决。

var app = require('http').createServer(handler);
var io = require('socket.io')(app);
var fs = require('fs');

app.listen(8000);

function handler (req, res) {
    fs.readFile(__dirname + '/index.html',
    function (err, data) {
        if (err) {
            res.writeHead(500);
            return res.end('Error loading index.html');
        }
        res.writeHead(200);
        res.end(data);
    });
}

io.on('connection', function (socket) {
    socket.emit('news', { hello: 'world' });
    socket.on('my other event', function (data) {
        console.log(data);
    });
});

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

该示例早在 socket 中就可以工作。 [email protected] 在 1.3.1 和 1.3.2 之间发生了一些事情。

我面临与用户 invisibleroads 完全相同的问题。 当我切换到它的默认命名空间时,它的工作端口也与 80 不同。只要有命名空间在使用,就会出现 CORS 错误......

我在调试 webpack-dev-server 的 socket 连接时也遇到了这个问题。

我试图按照此修复程序中的修改进行操作,它对我有用:)
提交已合并但尚未发布。

注意:在修复中loc.hostname不包含端口,但loc.host 。 这就是诀窍。

我可以重现这个问题。 事实上,在在这里找到问题之前,我什至在 stackoverflow 上描述了它:
http://stackoverflow.com/questions/29290563/socket-io-client-ignoring-port-when-namespace-used-bug
可以看到已经合并了,什么时候发布? 现在它阻止我将 npm 包用于 socket.io-client,并使用我自己的本地修改副本。

+1

这在 5abd97b2313aa3e9c9b2e1035dd4c24379fd77e8 中得到了修复,但不知何故没有进入socket.io.js
我猜有人在发布新版本之前忘记运行make了吗?

距离上一个补丁版本发布已经一个月了。 我认为是时候发布包含此修复程序的新补丁版本了?

+1

:+1:

:+1:

:+1:

在 1.3.5 中仍然面临这个问题......

我正在根据此处的修复手动更新 socket.io.js 文件: https :

+1

:+1:

+1

新版本多久会出:问题:

@rauchg是否可以发布新版

+1

:+1:

由于这个错误,我们仍然停留在 1.3.1 上。 @rauchg ,下一个版本什么时候有更新?

@pacarole :虽然这很烦人,但考虑到简单的解决方法,“被卡住”似乎

我们还停留在1.2.1,并且一直在尝试升级到1.3.x 半年:P 感觉很有趣,尽管此后发布了新版本,但这种基本错误仍未解决。 我真的希望在修复之前在 1.2.1 中没有发现严重的安全问题;)

对于每个人,这是@ahmetemir https://github.com/Automattic/socket.io/issues/2025#issuecomment -76386655 的快速修复

添加类似{port:3000}选项作为选项,例如:
不是 window.socket = io.connect('vagrant:30002/tty/test');而是 window.socket = io.connect('vagrant:30002/tty/test', {port:30002} );

这是我的_WORKS_(_/ω\_)

我仍然有这个问题。

我刚遇到这个。 我的解决方法是:

var socket = io.connect(window.location.origin + '/namespace');

:see_no_evil:

@bugeats此解决方法有效。 然而不幸。

+1

@bugeats有正确答案,现在应该关闭

@iamwave007 ,不,不应该。 @bugeats只描述了一种解决方法,但问题应该在库内修复。

我完全同意@JustBlackBird :-)

看起来修复程序已经应用于lib/url.js 。 (8 个月前???5abd97b2313aa3e9c9b2e1035dd4c24379fd77e8)
然而,该修复程序仍未应用于捆绑的socket.io.js

这个错误也影响了我。

正如@invisibleroads所说,它在 1.3.1 中工作(根据我的个人经验在 1.2.0 中)。
它在 1.3.2 中再次被破坏。

这个问题看起来像一个鬼魂一次又一次地困扰着 socket.io 客户端,直到时间结束。
必须有人解除诅咒;-)。

+1

+1

+1

+1

+1

+1

@yamsellem解除诅咒 atm

+1

@rauchg@nkzawa这方面有什么进展吗?

这些 +1 帖子非常烦人,因为它们对讨论没有任何贡献,订阅该主题的每个人都会被无用的电子邮件淹没。

对不起,但不得不说。 现在您可以删除此帖子触发的电子邮件:)

@deefens我猜 +1 是订阅主题的简单方法(
_有更好的方法_:问题顶部的“通知”标签带有“订阅”按钮;-)。

@yamsellem这不仅是一种订阅方式,也是一种向维护者展示有多少人面临这个问题的方式。

已在 1.4.x 中修复。

此页面是否有帮助?
0 / 5 - 0 等级