【问题标题】:Socket.io connection url?Socket.io 连接网址?
【发布时间】:2012-04-01 12:37:59
【问题描述】:

我有当前的设置:

  1. Nodejs 代理(运行 http-reverse-proxy)在端口 80 上运行。
  2. Rails 服务器在 3000 端口上运行
  3. Nodejs Web 服务器运行在 8888 端口

所以任何以 /nodejs/ 开头的请求都会被重定向到 8888 上的 nodejs 网络服务器。

任何其他内容都将被重定向到端口 3000 上的 rails 服务器。

目前 Socket.io 需要 io.connect 的连接 url。

请注意,/nodejs/socket.io/socket.io.js 有效,并返回所需的 socket.io 客户端 js 库。


但是,我无法在我的服务器上将 connection_url 指定到 /nodejs/。

我已经尝试过http://myapp.com/nodejs 和其他变体,但我仍然收到以下 url http://myapp/socket.io/1/?t=1331851089106 的 404 错误

是否可以告诉 io.connect 为每个连接 url 加上 /nodejs/ 前缀?

【问题讨论】:

标签: socket.io


【解决方案1】:

从 Socket.io 版本 1 开始,资源已被路径替换。使用:

var socket = io('http://localhost', {path: '/nodejs/socket.io'});

见:http://blog.seafuj.com/migrating-to-socketio-1-0

【讨论】:

    【解决方案2】:

    你可以像这样指定资源:

    var socket = io.connect('http://localhost', {resource: 'nodejs'});
    

    默认resource = "socket.io"

    【讨论】:

    • 其实我觉得需要换成{resource: 'nodejs/socket.io'}
    • 从 v1.0 开始已经过时。资源已被路径替换。而是使用: var socket = io('localhost', { 'path': '/nodejs/socket.io'});
    【解决方案3】:

    如果你在 nodejs 中使用 express:

    服务器端:

    var io = require('socket.io')(server, {path: '/octagon/socket.io'});
    

    然后

    io.on('connection', function(socket) {
            console.log('a user connected, id ' + socket.id);
            socket.on('disconnect', function() {
                console.log('a user disconnected, id '  + socket.id);
            })
    })
    socket.on('publish message ' + clientId, function(msg) {
            console.log('got message')
        })
    

    客户端:

    var socket = io('https://dev.octagon.com:8443', {path: '/octagon/socket.io'})
    

    然后

    socket.emit('publish message ' + clientId, msg)
    

    【讨论】:

    • 我发现除了服务器端,在客户端,使用var socket = io({path: '/octagon/socket.io'}) 对我有用。
    【解决方案4】:

    我使用以下方法来实现这个目标:

    客户端:

    var socket = io.connect('http://localhost:8183/?clientId='+clientId,{"force new connection":true});
    

    服务器端:

    var io = require('socket.io').listen(server);
    io.sockets.on('connection', function(socket) {
        console.log("url"+socket.handshake.url);
        clientId=socket.handshake.query.clientId;
        console.log("connected clientId:"+clientId);
    
    });
    

    参考:https://github.com/LearnBoost/socket.io/wiki/Authorizing#global-authorization

    【讨论】:

    • 在这个 uri 中; localhost:8183 ;你为什么用8183?我们知道socket io的端口是3000?
    • @shihab_returns 您可以分配任何您想要的端口。您不需要使用 3000。
    【解决方案5】:

    如果您使用 express 为您的应用程序提供服务,那么也许您可以检查一下。请记住 express 使用 http 为您的应用程序提供服务。

    const express   = require('express'),
          http      = require('http'),
          socketIo  = require('socket.io'),
          app       = express()
    
    var server = http.createServer(app);
    var io     = socketIo(server);
    
    io.on('connection', (socket)=>{
          // run your code here
    })
    
    server.listen(process.env.PORT, ()=> {
        console.log('chat-app inintated succesfully')
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 2017-03-27
      • 2023-03-18
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2014-02-27
      相关资源
      最近更新 更多