2015-08-14 3 views
0

Я создал частную чатовую систему с использованием Node.js и Socket.io на моем локальном сервере разработки, и он отлично работает, отправляет сообщения , обновляет базу данных всякий раз, когда клиент принимает событие сообщения. Тем не менее, за последние два дня я пытался подтолкнуть его к моему серверу Rackspace. Я беседовал с Rackspace, и они развернули мой узел-сервер, у меня есть console.log, который печатает «Сервер, прослушивающий порт: xxxx». Я отправлю свой код сервера node.js, а также некоторые из моего кода клиента. Я просто не уверен, что происходит не так, поскольку он отлично работал на моем местном развитии. Консоль Chrome дает мне сообщение об ошибке «io не определено», что заставляет меня думать, что он не загружает socket.io/socket.io.js с узла сервера. Однако я думал, что это даст мне ошибку в запросе GET.Node.js и Socket.io перемещаются с локального сервера разработки на живой сервер, а не на соединение

Я новичок в Node.js и Socket.io и не понимаю все об этом. Я пытаюсь использовать это на хосте vhost, может ли это вызвать проблему?

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

app.listen(3000, function() { 
    console.log("Server listening on: 3000"); 
}); 

var clients = {}; 

function handler (req, res) { 
    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
     if (err) { 
      res.writeHead(500); 
      return res.end('Error loading index.html'); 
     } 
     res.writeHead(200); 
     res.end(data); 
    }); 
} 

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

io.sockets.on('connection', function(socket){ 
    console.log("Connected!"); 
    socket.emit('news', { hello: 'world' }); 

    socket.on('add-user', function(data){ 
     clients[data.username] = {"socket" : socket.id}; 
     console.log(data.username+'/'+clients[data.username].socket);  
    }); 

    socket.on('private-message', function(data){ 
     console.log("Sending: " + data.content + " to " + data.username); 
     if (clients[data.username]){ 
      io.sockets.connected[clients[data.username].socket].emit("add- message", data); 
     } else { 
      console.log("User does not exist: " + data.username); 
     } 
    }); 

//Removing the socket on disconnect 
socket.on('disconnect', function() { 
    for(var name in clients) { 
     if(clients[name].socket === socket.id) { 
      delete clients[name]; 
      break; 
     } 
    } 
    }); 

}); 

Client Код:

var socket = io; 
socket.connect('x.x.x.x:3000'); 
var viewingUser = $('#viewingUserID').val(); 
socket.on("news", function (data) { 
    console.log(data); 
}); 

socket.emit("add-user", {"username" : viewingUser }); 

So I replaced "<script type="text/javascript" src="xx.xxx.xxx.xxx:3000/socket.io/socket.io.js">" with "<script type="text/javascript" src="https://cdn.socket.io/socket.io-1.3.5.js"></script>" 

Это ошибка:

GET http://23.253.247.166:3000/socket.io/?EIO=3&transport=polling&t=1439565622045-29 net::ERR_CONNECTION_REFUSED 
+0

Так я заменил "<тип скрипта =" текст/JavaScript»SRC = "xx.xxx.xxx.xxx:3000/socket.io/socket.io.js"> "с" " –

ответ

0

Ваш сервер не имеет обработчика запросов для Socket.io файла JavaScript.

Вы просматриваете свой сайт, и ваш сервер получает запрос, вы обрабатываете его, отправив файл index.html.

Когда файл index.html обрабатывается браузером, он найдет тег сценария socket.io и сделает запрос на сервер для него, но вы отвечаете только на запросы, отправив файл index.html.

Либо:

  • Попробуйте заменить тег скрипт SRC с версии CDN от Socket.io (версии клиента).

или

  • Добавление обработчика запроса для отправки файла JavaScript при запросе

Если вы должны служить статический контент (например, веб-страниц/JavaScript/CSS/изображений/...) Экспресс делает это очень легко:

app.use(express.static('public')); Где public будет папкой ваших статических активов.

код

Сервер:

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

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

// Socket stuff goes here. but try this for a start 
io.on('connection', function(socket){ 
    console.log('a user connected'); 
}); 

http.listen(3000, function(){ 
    console.log('Server listening on:3000'); 
}); 
+0

Кроме того, я просто заметил, не должно быть : 'var socket = io();' в скрипте на стороне клиента? –

+0

Обновлен мой ответ. –