简体   繁体   English

Socket.io连接使Node.js服务器崩溃

[英]Socket.io connection crashing node.js server

I've never really used Socket.io before, so I don't understand how it works. 我以前从未真正使用过Socket.io,所以我不了解它是如何工作的。 That's why I went to start following this tutorial: 这就是为什么我开始遵循本教程的原因:

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

Unfortunately it's horrible about bugs, and I'm getting one I just can't seem to fix. 不幸的是,关于错误的问题太可怕了,我得到了一个我似乎无法修复的错误。

I'm running this on my personal server which is setup with a typical LAMP server setup on Ubuntu. 我在个人服务器上运行此程序,该服务器已在Ubuntu上使用典型的LAMP服务器设置进行了设置。 Apparently this exercise doesn't use any of the server resources, so it's just in the www folder for no beneficial reason. 显然,此练习不使用任何服务器资源,因此出于无益的原因,它仅位于www文件夹中。

So to connect to my server I can just go to http://computername/ But to view the socket pages, I go to http://computername:8001/ 因此,要连接到我的服务器,我可以转到http://computername/但是要查看套接字页面,请转到http://computername:8001/

My project folder contains two files, "server.js" and "socket.html". 我的项目文件夹包含两个文件,“ server.js”和“ socket.html”。

After starting the project I updated node.js to 0.10.18, and I installed Socket.io to the directory using "sudo npm install socket.io" 启动项目后,我将node.js更新为0.10.18,然后使用“ sudo npm install socket.io”将Socket.io安装到目录中。

This is server.js: 这是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);

And this is socket.html: 这是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> 

Whenever I start the server and navigate to socket.html, it loads the page info, but immediately gets the following error: 每当我启动服务器并导航到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)

And once it gets this, my server crashes with a massive dump. 一旦得到这个,我的服务器就会因为大量的转储而崩溃。 The most error-like output I could find in it said "TypeError: Object function Buffer(subject, encoding, offset)"... 我能在其中找到的最类似于错误的输出是“ TypeError:对象函数Buffer(subject,encoding,offset)” ...

I've read elsewhere that similar errors are related to duplicating connections, and I noticed if I take out the code that tries to establish a connection, just leaving the socket.io code and the other basic server code, it will register connections every couple of seconds, even though I never told it to. 我在其他地方读过,类似的错误与复制连接有关,并且我注意到,如果我取出尝试建立连接的代码,只剩下socket.io代码和其他基本服务器代码,它将每两对注册一次连接秒,即使我从未告诉过。 Does anyone have an explanation for this? 有人对此有解释吗?

You need to instanciate the socket.io server with the server instance instead of using listen, else it will create its own http server. 您需要使用服务器实例实例化socket.io服务器,而不是使用listen,否则它将创建自己的http服务器。

server.js: 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: 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM