簡體   English   中英

Socket.io連接使Node.js服務器崩潰

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

我以前從未真正使用過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:對象函數Buffer(subject,encoding,offset)” ...

我在其他地方讀過,類似的錯誤與復制連接有關,並且我注意到,如果我取出嘗試建立連接的代碼,只剩下socket.io代碼和其他基本服務器代碼,它將每兩對注冊一次連接秒,即使我從未告訴過。 有人對此有解釋嗎?

您需要使用服務器實例實例化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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM