2016-11-12 401 views
0

我有一个node.js服务器在端口8443上运行。每当我尝试通过浏览器运行应用程序时,我的socket.io会在URL最后变成红色前保持连接大约20秒。Socket.io js无法连接

编辑3:这是安装在服务器上我的目录结构,现在有更新的文件

/var/www/html/nodetest/ 

这里面

/node_modules 
/app.js 
/index.html 

节点JS。

这里是我的主app.js代码(如在回答提示):

var app = require('express')(); 
var server = require('http').createServer(app); 
var io = require('socket.io')(server); 
var fs = require('fs'); 

    // Run server to listen on port 8443. 
    server = app.listen(8443,() => { 
    console.log('listening on *:8443'); 
}); 

io.listen(server); 

io.sockets.on('connection', function(socket) { 
    socket.emit('message', 'this is the message emitted by server'); 
    }); 

app.get('/', function(req, res){ 
    fs.readFile(__dirname + 'index.html', function(error, data) { 
     res.writeHead(200); 
     res.end(data);   
    }); 
}); 

这是我的客户端浏览器端代码:

<html> 
<head> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.5.1  
/socket.io.min.js"></script> 
    <script type="text/javascript"> 
     var websocket; 
     function onload() { 
     websocket = io.connect(); 
     websocket.on('message',function(data) { 
      console.log('Received a message from the server!',data); 
     }); 

    }; 
    </script> 
</head> 
<body onload="onload()"> 
    <div id="divId"></div> 
</body> 
</html> 

以下是错误

的图像

enter image description here

现在它显示404错误

+0

什么是它变成了错误? –

+0

@JustGameDev没有错误类型显示。它只是尝试连接超过20秒,然后URL变成红色。 –

+0

服务器和客户端的端口不同。 – ppovoski

回答

0

我已经修改了代码,根据自己的需要。该代码正在工作,因为它显示了在浏览器的控制台中加载后服务器发出的消息,如下图所示。

Server.js:

let express = require('express') 
let app = express(); 
let http = require('http').Server(app); 
let io = require('socket.io')(http); 

let port = 8443; 
var fs = require('fs'); 
var path = require('path'); 

app.get('/', function (req, res) { 
    fs.readFile(path.join(__dirname, 'index.html'), function (error, data) { 
     res.writeHead(200); 
     res.end(data); 
    }); 
}); 

// Run server to listen on port 8443. 
http.listen(port, function() { 
    console.log(`listning on ${port}`); 
}); 

io.on('connection', function (socket) { 
    socket.emit('message', 'this is the message emitted by server'); 
    socket.on('disconnect', function() { 
     console.log('Client disconnected'); 
    }); 
}); 

的index.html

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta charset="utf-8" /> 
    <title></title> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.5.1/socket.io.min.js"></script> 
    <script type="text/javascript"> 
     var websocket; 
     function onload() { 
      websocket = io().connect(); 
      websocket.on('message', function (data) { 
       console.log('Received a message from the server!', data); 
      }); 

     }; 
    </script> 

</head> 
<body onload="onload();"> 

</body> 
</html> 

的出来说就是如下:enter image description here

+0

谢谢你的代码。但仍然不起作用。 –

+0

你面临的错误或问题是什么?你可以使用所做的更新来编辑你的问题吗? –

+0

Gaikwasd现在检查 –

0

你正在以我还没有看到的方式做到这一点。这是一个正在工作的例子。主要区别是我的web服务器返回我正在与套接字连接的文件。

编辑:我更新了这个使用你的网络服务器。我修改它使它成为服务器的index.html文件。

网络服务器:

var app = require('express')(); 
    var server = require('http').createServer(app); 
    var io = require('socket.io')(server); 
    var fs = require('fs'); 

    // Run server to listen on port 8000. 
    server = app.listen(8447,() => { 
     console.log('listening on *:8447'); 
    }); 

    io.listen(server); 

    io.sockets.on('connection', function(socket) { 
     socket.emit('message', 'this is the message emitted by server'); 
    }); 

    app.get('/', function(req, res){ 
     fs.readFile(__dirname + '/index.html', function(error, data) { 
     res.writeHead(200); 
     res.end(data);   
     }); 
    }); 

的index.html

<html> 
    <head> 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.5.1/socket.io.min.js"></script> 
     <script type="text/javascript"> 
     var websocket; 
     function onload() { 
      websocket = io.connect(); 
      websocket.on('connect',function() { 
       console.log('Client has connected to the server!'); 
      }); 
      websocket.on('message',function(data) { 
       console.log('Received a message from the server!',data); 
      }); 
      websocket.on('disconnect',function() { 
       console.log('The client has disconnected!'); 
      }); 
     }; 
     </script> 
    </head> 
    <body onload="onload()"> 
     <div id="divId"></div> 
    </body> 
</html> 
+0

谢谢@ppovoski我试过你的代码。但现在它为socket.io引发404错误,js –

+0

运行'npm install socketio'。 – ppovoski

+0

或者用你的cloudflare行替换我的src行。 – ppovoski

0

你正在创建两个单独的服务器,仅启动其中之一,所以你的socket.io服务器永远不会启动。

更改此:

var app = require('express')(); 
    var server = require('http').createServer(app); 
    var io = require('socket.io')(server); 

    // Run server to listen on port 8000. 
    server = app.listen(8447,() => { 
    console.log('listening on *:8447'); 
    }); 

这样:

var app = require('express')(); 

    // Run server to listen on port 8000. 
    var server = app.listen(8447,() => { 
    console.log('listening on *:8447'); 
    }); 
    var io = require('socket.io')(server); 

app.listen()创建自己的服务器,所以你不想使用它和http.createServer()

下面是app.listen()代码,以便你可以看到它是如何工作的:

app.listen = function(){ 
    var server = http.createServer(this); 
    return server.listen.apply(server, arguments); 
}; 

所以,你可以看到你http.createServer()创建然后绑定到socket.io服务器从未开始.listen()

+0

我试过你的解决方案,但它仍然显示与我的问题中添加的图像相同的错误。 –

+0

@ArthParikh - 那么你还有其他一些问题需要解决,因为这绝对是你错误的第一件事。 – jfriend00

0

你犯了一个简单的错误。在您的html文件中,将socket.io库文件源https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.5.1/socket.io.min.js更改为socket.io cdn sorce,即https://cdn.socket.io/socket.io-1.4.5.js

之后,运行重新启动你的应用程序。

如果哟再次获得404,然后在你的HTML代替websocket = io.connect();websocket = io.connect(your_server_domain_or_host_name:nodejs_server_running_port);

+0

看到这个答案[希望它会工作](http://stackoverflow.com/a/40624874/3176120)@ arth-parikh – Emran

+0

不,我试过这个解决方案仍然URL尝试连接,但不工作。 –