2017-08-15 122 views
0

晚上SO社區,我很努力地解決這個問題,但我想我需要你的智慧,因爲我真的不知道這裏有什麼問題。我有一個node.js服務器,它通過express來提供index.html。我目前正在開始使用socket.io。Node.js和socket.io成千上萬的連接嘗試失敗

這是我的客戶端代碼:

$(document).ready(function() { 

document.getElementById("start").addEventListener("click", startGame); 


function startGame() { 
    var socket = io(); console.log("Sending request to server"); 
    socket.emit('connectToTable', {tableID: 1});  

socket.on('successfulConnection', function(msg){ 
      alert(msg); 
     }); } 

}); 

這是我的服務器端代碼:

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var express = require('express'); 
var port = process.env.PORT || 3000; 
path = require('path'); 

app.use(express.static(path.join(__dirname, '/'))); 

app.get('/', function(req, res){ 
    res.sendFile(__dirname + '/index.html'); 
}); 

io.on('connection', function(socket){ 
    console.log("There is someone knocking on the door") 
    socket.on('connectToTable', function(socket){ 
    console.log("Received player request") 
    var player = new Player(socket.id); 
    socket.emit('successfulConnection', "The connection to the server has been successful"); 
    }); 
}); 

http.listen(port, function(){ 
    console.log('listening on *:' + port); 
}); 

在我的我看到「在服務器上的控制檯有人敲門「每秒打印數百或數千次,導致100%的CPU負載。同時,我可以在客戶端(在Chrome中)看到正在進行數百次xhr民意調查。

Connections in Chrome

我真的不明白,爲什麼第一次連接嘗試之後沒有建立連接和重試SOOO頻繁。此外,我甚至不明白爲什麼它甚至使用xhr輪詢而不是websockets。

幫助將非常高度讚賞。提前謝謝你。

+1

有,這是由缺少分號在執行console.log()線在服務器端的結束造成的任何機會呢? – Jordan

+1

此外,我會刪除'新玩家'行作爲測試,看看是否可能導致該事件內的異常。 – Jordan

+0

@Jordan:不幸的不是。我剛剛嘗試過,我之前沒有在代碼中使用過這個console.log。而且現代JS不應該太在意這一點。但好主意。我很好奇可能會導致這個問題..真的不知道了。我不知道它是否可能與通過快遞根文件夾的靜態服務有關... 編輯:刪除它沒有幫助。我沒有得到任何錯誤順便說一句。 – DesperateEi

回答

2

你必須使用socket.io相同版本,在客戶端和服務器上(我有5天前有同樣的問題),檢查與控制檯:

NPM名單插座。 IO

服務器的版本,如果你使用相同版本的客戶端,上的index.html像這樣看:

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script> 

您可以從這裏得到的網址:

Versions of socket.io

問候

+1

此外,我解決了這個問題:var socket = io.connect('ws:// yourDomain:port /',{transports:['websocket']}); (在openshift我需要使用端口8000的http和8443的https)。 –

+0

非常感謝。我從來沒有發現這一點。是的,當你通過npm在節點上安裝它時會發生這種情況,但是從(舊)教程代碼複製前端行。 – DesperateEi

相關問題