2014-07-17 35 views
27

Kötü sonuçlarla socket.io ile kurulmuş bir sunucu kurmaya çalışıyorum. biraz eskimiş olsasocket.io - işe yaradıramadı, bir tür yoklama çağrısı 404'sı var

çoğunlukla, bu kılavuzu takip ediyorum: istemci veya sunucu tarafı ise http://www.williammora.com/2013/03/nodejs-tutorial-building-chatroom-with.html

sorun socket.io ile gelir, emin değilim. Sunucuyu sürekli olarak sorgulamaya çalışıyor gibi görünüyor, ancak 404'leri geri alıyor. Bu soket gibi çalışmıyor, ama hepsi bana iyi görünüyor. Ayrıca yollar ile ve "genel" bir dizine sahip olmakla ilgili bir şey olabilir, ama gerçekten bilmiyorum.

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" 

Sunucu

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."); 
}); 

Müşteri

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

ben aşamasındaki müşteri js dosyası var: node_modules/socket.io/node_modules/socket.io-istemci/soket.io.js

Bu yol, kullandığım öğreticinin ne yazdığını veya hangi socket.io'nun kullanacağını söylemesiyle eşleşmiyor, bu yüzden sorun belki de doğru dosya gibi görünüyor.

Burada herhangi bir yardım var mı? Ben sunucu tarafında socket.io başlar nerede

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 

my_modules klasöründe server.js geçerli: Ek bilgi için

DÜZENLEME , burada benim klasör hiyerarşisi. Js klasöründeki server.js, web sitesinden bağlanacak istemci kodudur.

+0

Nginx (veya başka bir web sunucusu) düğümün önünde mi kullanıyorsunuz? eğer öyleyse, düzgün bir şekilde düğümlemek için proxy değil gibi görünüyor. – Curious

+0

Nope, sadece düz bir şekilde, benim için gerekli olan tüm şeylerle birlikte (express vb.). Nginx veya apache yok. – Eli

cevap

50

Bu, Socket.IO'nun /socket.io/ ile başlayan istekleri karşılayamadığını gösteriyor. Bunun nedeni, dinleyicinizin app - bir Express işleyicisi olmasıdır. http dinleyici olmak zorundasınız, böylece Socket.IO'nun istek üzerine erişimi olacaktır.

http.listen(8080, "127.0.0.1"); 

detaylar için dokümanlar bakın

ile

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

yerine deneyin: http://socket.io/docs/#using-with-express-3/4 Benim durumumda

+1

Siz adamsınız! Çok teşekkürler, bu hile yaptı. Kullandığım kılavuzda bir yorum yayınlamak zorundayım. – Eli

+1

Uygulamanın yerine http.listen (express durumunda) kullanmak benim için bunu çözdü, teşekkürler. – Notflip

+0

App tarafından kullanılan bir express.Router var ve aynı sorunu yaşadı. Http dinlemesine izin vermek yerine, yine de uygulama yönlendirmesini sağlam tutmamdaki sorunumu çözdüm. Teşekkürler bir demet @Curious! Başvurduğunuz aynı sayfayı buldum, ancak bir şekilde çözümü gözden kaçırmayı başardı! : D – hasse

2

Sadece sunucunuzun veya yalnızca istemci sorununun kontrolü için, bu istemci şu sunucudan yararlanabilir: websocket-echo, bu istemci sunucuya doğrudan bağlanırsa (sunucunuz çevrim içi ise, ilk form istemcisi yararlıysa, ana bilgisayarınızdaysa,

bir metin düzenleyicisi kullanarak ... websocket.org gelen cuoting, aşağıdaki kodu kopyalayıp sabit diskinizde bir yere websocket.html olarak kaydedin

Kodu: websocket-test

Gözlemleyebildiğimden farklı olan tek şey, istemci tarafında io client kaynağı: <script src="/socket.io/socket.io.js"></script> .

"dependencies": { 
    "express": "3.x.x", 
    "socket.io": "*", 
    "util": "*" 
    } 
: En package.json dosyasına Aşağıda bu kodu ekleyin sana tavsiye : Bu şekilde bu bağımlılıkları ile çalışıyor o

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); 

Not: En sunucuda

bu şekilde denemelisiniz

Şerefe!

+0

Kodunuzun yardımcı olduğu gibi görünmüyor ve ayrıca eski bir ifade sürümünüz var (json artık sürümümde bir bağımlılık değil ve ayrı olarak yüklenmelidir). Websocket-echo'yu nasıl kullanırım? URL olarak ws: // localhost: 8080'i eklemeyi denedim ve bağlantı kurulmuyor gibi görünüyor. – Eli

+0

Ayrıca /socket.io/socket.io.js'yi istemci kodunun URL'si olarak kullanmaya çalıştığımda da, bir 404 elde ediyorum. Klasör sıradüzenim artık benim gönderimimde düzenleniyor. – Eli

+0

evet, websocket-echo için üzgün, ev sahibi üzerinde çalışan bir sunucuya ulaşmaya çalışıyorsanız, işe yaramaz gibi görünüyor, bunun yerine kendi testini denemelisiniz: [link] http://pastebin.com/NW3dWb2c (property www.websocket.org), json hattı sizi şaşırtıyorsa ... projemden: P. Socket.io (client) kullanabilmek için socket.io klasörünüzü (genellikle düğüm modüllerinde) nereye koyduğunuzu bulmanız gerekir, sizin durumunuza göre, şunu belirtmeliyim: /socket.io/socket.io .js. Yine de kodum size yardım etmiyorsa özür dilerim. – lgargantini

2

, ben Express application generator ile benim app yarattı. Sunucu belirlendikten sonra projenin kök klasörü app.js dosyası, ben on line dosya bin/www düzenlenmiş yerine düzenleme, bu sorunu çözmek için:

/** 
* Create HTTP server. 
*/ 

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

Güncelleme

Burada daha iyi bir yol buldum Express Generator and Socket.io

+0

Tabii ki, bu benim için çalıştı. Bin/www klasörü hakkında bile bilmiyordum –