简体   繁体   中英

Socket.io connection crashing node.js server

I've never really used Socket.io before, so I don't understand how it works. That's why I went to start following this tutorial:

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. Apparently this exercise doesn't use any of the server resources, so it's just in the www folder for no beneficial reason.

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/

My project folder contains two files, "server.js" and "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"

This is 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:

<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:

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)"...

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. 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.

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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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