代码之家  ›  专栏  ›  技术社区  ›  TomáÅ¡ Zato

无法连接到套接字io服务器

  •  2
  • TomáÅ¡ Zato  · 技术社区  · 6 年前

    我有一个正在运行的bot socket IO客户端和服务器。我想让客户端与服务器通信。

    服务器初始化

    this.http_server = net.createServer();
    // this didn't work too. Exxentially socket io does not work at all
    //   this.io = io.listen(typeof port == "number" ? port : process.env.PORT);
    console.log("[ManagementServer] Attaching socket IO to HTTP server.");
    this.io = io(this.http_server);
    /// The port does open
    this.http_server.listen(typeof port == "number" ? port : process.env.PORT,
        () => {
            console.log('[ManagementServer] IO HTTP server listening on port', this.http_server.address().port)
        });
    /// The connection listener is triggered, but IO doesn't bother 
    /// replying or something
    this.http_server.on("connection", (req, res) => {
        console.log("[ManagementServer] Connection received, but IO ignores it.")
    });
    // Never happens
    this.io.on("connection", (socket) => {
        this.connection(socket);
    })
    

    客户端初始化

    const srvurl = "http://" + this.remoteAddr + ":" + this.remotePort;
    
    console.log("[UDP_socketio] Connecting to server: ", srvurl)
    this.client = socketioclient(srvurl);
    
    this.client.once("connect", () => {
        console.log("[UDP_socketio] Connected to remote server, identificating.")
        this.sendIdentification();
    });
    
    this.client.on("error", () => {
        console.error("[UDP_socketio] Socket IO connection error.")
    });
    

    套接字IO调试输出

    我启用了调试,但套接字IO调试输出无论如何都不是很有用:

    [ManagementServer] Attaching socket IO to HTTP server.
      socket.io:server initializing namespace / +0ms
      socket.io-parser encoding packet {"type":0,"nsp":"/"} +0ms
      socket.io-parser encoded {"type":0,"nsp":"/"} as 0 +1ms
      socket.io:server creating engine.io instance with opts {"serveClient":false,"path":"/","initialPacket":["0"]} +3ms
    [ManagementServer] IO HTTP server listening on port 80
    [UDP_socketio] Connecting to server:  http://127.0.0.1:80
      socket.io-client:url parse http://127.0.0.1:80 +0ms
      socket.io-client new io instance for http://127.0.0.1:80 +0ms
      socket.io-client:manager readyState closed +0ms
      socket.io-client:manager opening http://127.0.0.1:80 +1ms
      engine.io-client:socket creating transport "polling" +0ms
      engine.io-client:polling polling +0ms
      engine.io-client:polling-xhr xhr poll +0ms
      engine.io-client:polling-xhr xhr open GET: http://127.0.0.1/?EIO=3&transport=polling&t=MEuBb8c&b64=1 +1ms
      engine.io-client:polling-xhr xhr data null +0ms
      engine.io-client:socket setting transport polling +10ms
      socket.io-client:manager connect attempt will timeout after 20000 +12ms
      socket.io-client:manager readyState opening +1ms
    [ManagementServer] Connection received, but IO ignores it.
      socket.io-client:manager connect attempt timed out after 20000 +20s
      engine.io-client:socket socket close with reason: "forced close" +20s
      engine.io-client:polling transport not open - deferring close +20s
      engine.io-client:socket socket closing - telling transport to close +0ms
      socket.io-client:manager connect_error +2ms
      socket.io-client:manager cleanup +0ms
      socket.io-client:manager will wait 1178ms before reconnect attempt +1ms
      socket.io-client:manager attempting reconnect +1s
      socket.io-client:manager readyState closed +0ms
      socket.io-client:manager opening http://127.0.0.1:80 +1ms
    

    请注意,我添加的连接侦听器会触发,但套接字IO不会执行任何操作。

    到目前为止没有帮助的是:

    • 移除 connection 来自世界各地的听众 this.http_server
    • 更改用于测试的端口
    • 增加客户端尝试连接后的延迟
    • 阅读插座。io文档。它令人困惑、不完整、不准确且不一致。

    什么能让socket IO忽略所有这样的连接?也许服务器正在监听来自不同路径的请求?如果是这样,如何检查IO监听的路径?

    2 回复  |  直到 6 年前
        1
  •  2
  •   RaphaMex    6 年前

    插座木卫一 合作 http/s 像express(第7层)这样的服务器。

    是一个 传输控制协议 服务器(第4层)。

    所以它们不兼容。

        2
  •  0
  •   Fallen_Angel    3 年前

    确保你正在插入插座。伊奥。将js文件导入客户端代码并使用它。如果您试图在客户端创建自己的WebSocket,可能会遇到问题。

    对服务器执行以下操作:

    var app = require('express').createServer()
      , io = require('socket.io').listen(app);
    
    app.listen(80);
    
    app.get('/', function (req, res) {
      res.sendfile(__dirname + '/index.html');
    });
    
    io.sockets.on('connection', function (socket) {
      socket.emit('news', { hello: 'world' });
      socket.on('my other event', function (data) {
        console.log(data);
      });
    });
    

    对于您正在提供的HTML文件,类似于以下内容:

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

    确保你正在上菜。io/插座。伊奥。js从您的Web服务器目录。当你使用Firebug登录网页时,你可以使用Firebug来查看网页。