2011-12-24 23 views
6

Zgodnie z moją wiedzą, od http://socket.io/#how-to-use plik node.js automatycznie obsługuje plik socket.io na serwerze.Serwer Socket.io nie jest obsługiwany przez serwer Node.js

Mam zainstalowany plik socket.io z npm install socket.io i widzę, że znajduje się on w node_modules jeden poziom powyżej głównego katalogu serwera.

server.js:

var static = require('./plugins/node-static'); 
var socketIO = require('socket.io'); 
var clientFiles = new static.Server('./client'); 

var http = require('http'); 
httpServer = http.createServer(function (request, response) { 
    request.addListener('end', function() { 
      clientFiles.serve(request, response); 
     }); 
}).listen(8253); 

var webSocket = socketIO.listen(httpServer); 
webSocket.on('connection', function(client) { ..... 

index.html:

<html> 
<head> 
    <title>Chat</title> 
</head> 
<body> 
    <script src="/socket.io/socket.io.js"></script> 
    <script type="text/javascript" 
      src="http://code.jquery.com/jquery-1.5.2.js"></script> 

    <script type="text/javascript"> 
     $(document).ready(function() { 
      var webSocket = new io.Socket('localhost', { port: 8253 }); 
      webSocket.connect(); ....... 

Zaczynając serwer działa poprawnie, ale podczas otwierania index.html, pojawia się następujący błąd:

GET http://localhost:8253/socket.io/socket.io.js 404 (Not Found) 
Uncaught ReferenceError: io is not defined     :8253/:25 

Pomysły?

+0

"Widzę, że znajduje się on w module node_modules o jeden poziom powyżej głównego katalogu serwera." Co masz na myśli przez "główny serwer"? Nie mylić z jakimkolwiek śladem apache? Moduły zainstalowane przez NPM znajdują się w repozytoriach NPM, nie muszą być nigdzie w stosunku do głównego skryptu węzła twojego projektu. Pomyślne 'require ('socket.io')' wskazuje, że instalacja jest OK i problem jest w kodzie. – Kos

Odpowiedz

6

Spróbuj słuchania na serwerze po powiąże go z socket.io

Place to

httpServer.listen(8253); 

po

3

Edytowane: Przepraszam, napisałem coś, co nie odpowiedziało na twoje pytanie.

Po stronie klienta potrzebne są następujące elementy:

var socket = io.connect(); //Hostname and port not required - Autodetected 
socket.on('connect', function(){ 
    $('#status').text('Connected'); 
}); 
socket.on('message', function(m){ 
$('#message').text(m); 
}); 
socket.on('disconnect', function(){ 
$('#status').text('Disconnected'); 
}); 

przykład Praca =>https://github.com/parj/node-websocket-demo/blob/master/public/main.js

NPM informacyjnego (jeśli jest wymagane): Jeśli w systemie Linux

cd <location of your server.js> 
npm install -g socket.ion #install globally 
npm link socket.io. #Create a symbolic link 

Jeśli są w systemie Windows nie można zrobić npm link

cd <location of your server.js> 
npm install socket.io 

Twoja struktura katalogów powinna wyglądać

server.js 
node_modules/ #Directory - same level as server.js 
    socket.io #socket.io underneath that 

node_modules powinny być w tym samym katalogu co server.js, nie wyżej głównym serwera

+0

Nie pamiętam, żebym kiedykolwiek potrzebował takich magików, sam kurs nie sugeruje tego. 'npm install socket.io' powinien zrobić sztuczkę – Kos

+0

BTW" jeśli jesteś w systemie Windows "czy npm obsługuje teraz okna? – Kos

+0

1/npm na Windows => cf artykuł stackoverflow - http://stackoverflow.com/questions/7300132/how-to-use-npm-with-node-exe 2/Magic? :) Samouczki mówią o instalacji npm. Tęsknią za tym, co jeśli masz kilka projektów z tą samą biblioteką. Następnie dla każdego projektu uruchamiasz instalację npm? Lepszym rozwiązaniem (imo) jest zainstalowanie go globalnie 'npm install -g', a następnie utworzenie odnośnika do niego' npm link'. W ten sposób wystarczy zainstalować w jednym miejscu i uaktualnić tylko jedno miejsce. –

-1

Dla osób wdrażających system Azure (nie mogę ręczyć za żadną inną platformę), upewnij się, że plik package.json zawiera skrypt startowy.

Przykład:

"scripts" : { "start": "node index.js" } 
+0

Ta wskazówka jest ważna, ale w rzeczywistości nie dotyczy tego problemu. Azure ma określone wymagania dla aplikacji Node, ale nie ma to nic wspólnego z socket.io. – kubal5003

1

Podczas konwersji z regularnych wyraźnej aplikacji:

const express = require('express') 
const app = express() 
app.listen(3000, function() { 
    console.log('Example app listening on port 3000!') 
}) 

ważne jest, aby zrobić dwie rzeczy:

One (że jeden wierzę każdy dostaje po prawej):

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

Dwa (ten jest bardzo łatwo przegapić): połączeń server.listen zamiast app.listen

spędziłem prawie dwie godziny debugowania to, dlatego jestem dokumentowania.

Powiązane problemy