我在端口 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.
这看起来已由 #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 中修复。
最有用的评论
已在 1.4.x 中修复。