web-dev-qa-db-ja.com

socket.io-何らかのポーリングコールで404が発生し、動作しない

Socket.ioでサーバーをセットアップしようとしていますが、結果は良くありません。

多少古くなっていますが、ほとんどこのガイドに従っています: http://www.williammora.com/2013/03/nodejs-tutorial-building-chatroom-with.html

問題はsocket.ioに付属しています。クライアント側かサーバー側かはわかりません。サーバーを継続的にポーリングしようとしているようですが、404を取り戻しています。 socket.ioが実行されていないように思えますが、すべて問題ないようです。また、パスと何か関係があり、「パブリック」ディレクトリを持っているかもしれませんが、私は本当に知りません。

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"

サーバー

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

クライアント

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

クライアントjsファイルは、node_modules/socket.io/node_modules/socket.io-client/socket.io.jsから取得しました。

そのパスは、私が使用しているチュートリアルが言っていること、またはsocket.ioが使用するように言っていることのいずれとも一致しないため、おそらくそれが問題かもしれませんが、おそらく正しいファイルのようです。

ここで何か助け?

[〜#〜] edit [〜#〜]追加情報については、ここに私のフォルダ階層があります:

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フォルダー内のserver.jsは、サーバー側でsocket.ioを開始する場所です。 jsフォルダー内のserver.jsは、Webサイトから接続するためのクライアントコードです。

32
Eli

Socket.IOは/socket.io/で始まるリクエストをインターセプトできないようです。これは、あなたの場合、リスナーがapp-Expressハンドラーであるためです。 Socket.IOがリクエスト処理にアクセスできるように、httpをリスナーにする必要があります。

交換してみてください

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

http.listen(8080, "127.0.0.1");

詳細については、ドキュメントを参照してください: http://socket.io/docs/#using-with-express-3/4

61
Oleg

私の場合、 Express application generator でアプリを作成しました。この問題を解決するために、プロジェクトのルートフォルダーにあるapp.jsファイルを編集する代わりに、サーバーが定義された後の行でbin/wwwファイルを編集しました。

/**
 * Create HTTP server.
 */

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

更新

ここでより良い方法を見つけました Express Generator and Socket.io

5
Camilo

サーバーまたはクライアントの問題を確認するために、このWebを使用できます: websocket-echo 、このクライアントがサーバーに直接接続している場合(最初のフォームクライアントは、サーバーがオンラインの場合、ホスト上にある場合、websocket.orgからの引用に役立ちます...

テキストエディターを使用して、次のコードをコピーし、websocket.htmlとしてハードドライブのどこかに保存します

コード: websocket-test

私が観察できる私のものと異なる唯一のものは、ioクライアントソースです:<script src="/socket.io/socket.io.js"></script>クライアント側。

サーバーで次の方法を試してください。

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

この方法は、この依存関係で正常に機能することに注意してください。package.jsonファイルに以下のコードを追加することをお勧めします。

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

乾杯!

2
lgargantini