【问题标题】:Socket.io connection crashing node.js serverSocket.io 连接崩溃 node.js 服务器
【发布时间】:2014-10-14 20:11:45
【问题描述】:

我以前从未真正使用过 Socket.io,所以我不明白它是如何工作的。这就是我开始学习本教程的原因:

http://danielnill.com/nodejs-tutorial-with-socketio/

不幸的是,错误太可怕了,而且我得到了一个似乎无法修复的错误。

我在我的个人服务器上运行它,该服务器在 Ubuntu 上使用典型的 LAMP 服务器设置。显然这个练习没有使用任何服务器资源,所以它只是在 www 文件夹中,没有任何好处。

所以要连接到我的服务器,我可以去http://computername/ 但是要查看套接字页面,我会去http://computername:8001/

我的项目文件夹包含两个文件,“server.js”和“socket.html”。

启动项目后,我将 node.js 更新为 0.10.18,并使用“sudo npm install socket.io”将 Socket.io 安装到目录

这是 server.js:

var http = require('http');
var url = require('url');
var fs = require('fs');
var io = require('socket.io');

var server = http.createServer(function(request, response){
console.log('Connection');
var path = url.parse(request.url).pathname;

var waitToEnd = false;

switch(path){
    case "/":
        console.log("Returning homepage");
        response.writeHead(200, {'Content-Type':'text/html'});
        response.write('<strong>Hello World</strong>');
    break;
    case "/socket.html":
        waitToEnd = true;
        console.log("Returning socket page.");
        fs.readFile(__dirname + path, function(error, data){
            if(error){
                console.log("Error...");
                response.writeHead(404);
                response.write('ERROR 404');
            }
            else{
                console.log("Success...");
                response.writeHead(200, {'Content-Type': 'text/html'});
                response.write(data, "utf8");
            }
            response.end();
            console.log("Continuing...");
        });
    break;
    default:
        response.writeHead(404);
        response.write('ERROR 404');
    break;
}
if (!waitToEnd){
    response.end();
}
});
server.listen(8001);

ioOutput = io.listen(server);

这是socket.html:

<html>
    <head>
        <script src="/socket.io/socket.io.js"></script>
    </head>
    <body>
        <script>
            var socket = io.connect();
        </script>
        <div>This is our socket.html file</div>
    </body>
</html> 

每当我启动服务器并导航到 socket.html 时,它都会加载页面信息,但会立即收到以下错误:

GET http://computername:8001/socket.io/?EIO=3&transport=polling&t=1413317092992-41 net::ERR_CONNECTION_REFUSED
socket.io.js:2680Request.create
socket.io.js:2680Request
socket.io.js:2614XHR.request
socket.io.js:2555XHR.doPoll
socket.io.js:2585Polling.poll
socket.io.js:2951Polling.doOpen
socket.io.js:2895Transport.open
socket.io.js:2106Socket.open
socket.io.js:1580Socket
socket.io.js:1467Socket
socket.io.js:1419Manager.open.Manager.connect
socket.io.js:272(anonymous function)

一旦它得到这个,我的服务器就会因大量转储而崩溃。我能在其中找到的最类似错误的输出是“TypeError: Object function Buffer(subject, encoding, offset)”...

我在其他地方读到过类似的错误与重复连接有关,我注意到如果我取出尝试建立连接的代码,只留下 socket.io 代码和其他基本服务器代码,它将注册每隔几秒钟连接一次,即使我从未告诉过它。有人对此有解释吗?

【问题讨论】:

    标签: javascript node.js sockets socket.io


    【解决方案1】:

    你需要用服务器实例来实例化socket.io服务器,而不是使用listen,否则它将创建自己的http服务器。

    server.js:

    var http = require('http');
    var url = require('url');
    var fs = require('fs');
    
    var server = http.createServer(handler);
    var io = require('socket.io')(server);
    
    var handler = function(request, response){
    console.log('Connection');
    var path = url.parse(request.url).pathname;
    
    var waitToEnd = false;
    
    switch(path){
        case "/":
            console.log("Returning homepage");
            response.writeHead(200, {'Content-Type':'text/html'});
            response.write('<strong>Hello World</strong>');
        break;
        case "/socket.html":
            waitToEnd = true;
            console.log("Returning socket page.");
            fs.readFile(__dirname + path, function(error, data){
                if(error){
                    console.log("Error...");
                    response.writeHead(404);
                    response.write('ERROR 404');
                }
                else{
                    console.log("Success...");
                    response.writeHead(200, {'Content-Type': 'text/html'});
                    response.write(data, "utf8");
                }
                response.end();
                console.log("Continuing...");
            });
        break;
        default:
            response.writeHead(404);
            response.write('ERROR 404');
        break;
    }
    if (!waitToEnd){
        response.end();
    }
    };
    
    console.log("server listening");
    server.listen(8001);
    
    io.on('connection', function (socket) {
      console.log("socket connected");
      socket.emit('test', { hello: 'world' });
      socket.on('test_in', function (data) {
        console.log(data);
      });
    });
    

    client.js:

    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io();
      socket.on('test', function (data) {
        console.log(data);
        socket.emit('test_in', { hello: 'too' });
      });
    </script>
    

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2018-12-15
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      相关资源
      最近更新 更多