2014-07-17 7 views
27

Sto provando a ottenere un server configurato con socket.io, con risultati negativi.socket.io - impossibile farlo funzionare, avendo 404 in una sorta di chiamata polling

Io sono per lo più seguendo questa guida, anche se è un po 'fuori moda: http://www.williammora.com/2013/03/nodejs-tutorial-building-chatroom-with.html

Il problema viene fornito con socket.io, non sono sicuro se è client o lato server. Sembra che stia cercando di interrogare continuamente il server, ma sta tornando indietro 404. Sembra che socket.io non sia in esecuzione, ma mi sembra tutto a posto. Potrebbe anche avere qualcosa a che fare con i percorsi e con una directory "pubblica", ma non lo so davvero.

127.0.0.1 - - [Thu, 17 Jul 2014 00:51:36 GMT] "GET /socket.io/?EIO=2&transport=polling&t=1405558296120-0 HTTP/1.1" 404 73 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.76.4 (KHTML, like Gecko) Version/7.0.4 Safari/537.76.4" 
127.0.0.1 - - [Thu, 17 Jul 2014 00:51:37 GMT] "GET /socket.io/?EIO=2&transport=polling&t=1405558297181-1 HTTP/1.1" 404 73 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.76.4 (KHTML, like Gecko) Version/7.0.4 Safari/537.76.4" 
127.0.0.1 - - [Thu, 17 Jul 2014 00:51:39 GMT] "GET /socket.io/?EIO=2&transport=polling&t=1405558299207-2 HTTP/1.1" 404 73 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.76.4 (KHTML, like Gecko) Version/7.0.4 Safari/537.76.4" 

Server

var exec = require("child_process").exec; 
var path = require("path"); 
var morgan = require("morgan"); 
var bodyParser = require("body-parser"); 
var _ = require("underscore"); 
var express = require("express"); 
var app = express(); 
var http = require("http").createServer(app); 
var io = require("socket.io")(http); 

app.set("ipaddr", "127.0.0.1"); 
app.set("port", 8080); 

//support JSON, urlencoded, and multipart requests 
app.use(bodyParser()); 

//log the requests using morgan 
app.use(morgan()); 

//specify the Jade views folder 
app.set("views", __dirname + "/../views"); 

//set the view engine to Jade 
app.set("view engine", "jade"); 

//specify static content 
app.use(express[ "static" ]("public", __dirname + "/../public")); //using map-access of static so jslint won't bitch 

io.on("connection", function(socket) 
{ 
    console.log("A user connected."); 
}); 

client

script(src="js/socket.io.js") 
var socket = io.connect("http://localhost:8080"); 

ho ricevuto il file del client js da: node_modules/socket.io/node_modules/socket.io-client/socket.io.js

Quel percorso non corrisponde né a quello che dice il tutorial che sto usando, né a cosa dice socket.io, quindi forse questo è il problema, ma sembra che sia probabilmente il file corretto.

Qualsiasi aiuto qui?

EDIT Per ulteriori informazioni, ecco la mia gerarchia di cartelle:

Webserver/ 
    my_modules/ 
     server.js 
    node_modules/ 
     body-parser/ 
     express/ 
     jade/ 
     morgan/ 
     socket.io/ 
     underscore/ 
    public/ 
     css/ 
     js/ 
      server.js 
    views/ 
     index.jade 
    index.js 
    package.json 

Le server.js nella cartella my_modules è dove comincio socket.io sul lato server. Il server.js nella cartella js è il codice client per connettersi dal sito web.

+0

Stai usando nginx (o altro server web) davanti al nodo? se è così, sembra che non sia proxy per il nodo correttamente. – Curious

+0

No, solo nodo dritto, con tutte le cose che ho elencato nel mio richiede (espresso, ecc). Nessun nginx o apache. – Eli

risposta

50

Sembra che Socket.IO non possa intercettare richieste che iniziano con /socket.io/. Questo perché nel tuo caso l'ascoltatore è app - un gestore Express. Devi fare in modo che http sia ascoltatore, in modo che Socket.IO abbia accesso alla gestione delle richieste.

provare a sostituire

app.set("ipaddr", "127.0.0.1"); 
app.set("port", 8080); 

con

http.listen(8080, "127.0.0.1"); 

vedi Documentazione per i dettagli: http://socket.io/docs/#using-with-express-3/4

+1

Tu sei l'uomo! Grazie mille, questo ha funzionato. Dovrò pubblicare un commento nella guida che stavo usando. – Eli

+1

Utilizzando http invece di app.listen (in caso di espresso) risolto questo per me, grazie. – Notflip

+0

Ho un express.Router utilizzato dall'app e ho riscontrato lo stesso problema. Lasciando invece http listen ha risolto anche il mio problema mantenendo intatto il routing dell'app. Grazie mille @Curious! Ho trovato la stessa pagina a cui ti riferisci, ma in qualche modo sono riuscito a trascurare la soluzione! : D – hasse

2

Solo per verificare che sia il tuo server o solo un problema con il client puoi utilizzare questo web: websocket-echo, se questo client si connette direttamente al tuo server (il primo modulo client è utile se il tuo server è online, se è sul tuo host, cuoting da websocket.org ...

Utilizzando un editor di testo, copiare il seguente codice e salvarlo come websocket.html qualche parte sul vostro disco rigido

codice: websocket-test

L'unica cosa diversa dalla mia che ho potuto osservare è la sorgente del client io: <script src="/socket.io/socket.io.js"></script> dal lato client.

Sul server si dovrebbe provare in questo modo:

var express = require('express'), 
app = express(), 
http = require('http'), 
server = http.createServer(app), 
io = require('socket.io').listen(server), 
exec = require('child_process').exec, 
util = require('util'); 

//serve our code 
app.use(express.static('public')); 
app.use(express.json()); 
app.use(express.urlencoded()); 
//listening on connections 

io.on('connection', function (socket) { 
    console.log('client connected!'); 
} 
server.listen(8080); 

Si noti che in questo modo funziona bene con questo dipendenze: Vi consiglio aggiungere questo codice sottostante per il file package.json:

"dependencies": { 
    "express": "3.x.x", 
    "socket.io": "*", 
    "util": "*" 
    } 

evviva!

+0

Non sembra che il tuo codice sia d'aiuto, e hai anche una versione precedente di express (json non è più una dipendenza nella mia versione e deve essere installato separatamente). Come si usa websocket-echo? Ho provato a inserire ws: // localhost: 8080 come URL e non sembra connettersi. – Eli

+0

Anche quando provo a usare /socket.io/socket.io.js come URL per il codice client, ottengo un 404. La mia gerarchia di cartelle ora viene modificata nel mio post sopra. – Eli

+0

sì, mi dispiace per websocket-echo, sembra essere inutile se stai cercando di raggiungere un server in esecuzione sul tuo host, invece dovresti provare il tuo test in questo modo: [collegamento] http://pastebin.com/NW3dWb2c (proprietà di www.websocket.org), scusa se la linea json ti confonde ... è dal mio progetto: P. Per utilizzare socket.io (client) devi trovare dove è installata la tua cartella socket.io (generalmente su node-modules), nel tuo caso, penso che devi inserire: /socket.io/socket.io .js. Mi dispiace ancora se il mio codice non ti ha aiutato. – lgargantini

2

Nel mio caso, ho creato la mia app con il Express application generator. Per risolvere questo problema, invece di modificare il file app.js nella cartella principale del progetto, ho modificato il file bin/www sulla linea dopo che il server è definito:

/** 
* Create HTTP server. 
*/ 

var server = http.createServer(app); 
var io = require('socket.io')(server); // Add this here 

Aggiornamento

Ho trovato un modo migliore qui Express Generator and Socket.io

+0

Certo, questo ha funzionato per me. Non sapevo nemmeno della cartella bin/www –

Problemi correlati