socket.io - 无法让它工作,在某种轮询调用中有 404 [英] socket.io - can't get it to work, having 404's on some kind of polling call

查看:19
本文介绍了socket.io - 无法让它工作,在某种轮询调用中有 404的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 socket.io 设置服务器,但结果不佳.

I'm trying to get a server set up with socket.io, with bad results.

我主要遵循本指南,尽管它有些过时:http://www.williammora.com/2013/03/nodejs-tutorial-building-chatroom-with.html

I am mostly following this guide, although it's somewhat out of date: http://www.williammora.com/2013/03/nodejs-tutorial-building-chatroom-with.html

问题来自socket.io,我不确定是客户端还是服务器端.它似乎试图不断轮询服务器,但正在返回 404.这听起来像是 socket.io 没有运行,但在我看来一切正常.它也可能与路径和公共"目录有关,但我真的不知道.

The problem comes with socket.io, I'm not sure if it's client or server side. It appears to be trying to continuously poll the server, but is getting 404's back. That sounds like socket.io isn't running, but it all looks okay to me. It may also have something to do with paths and having a "public" directory, but I don't really know.

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

I got the client js file from: node_modules/socket.io/node_modules/socket.io-client/socket.io.js

该路径与我使用的教程或socket.io 所说的不匹配,所以也许这就是问题所在,但看起来它可能是正确的文件.

That path doesn't match either what the tutorial I'm using says, or what socket.io says to use, so maybe that's the problem, but it looks like it's probably the correct file.

这里有什么帮助吗?

编辑有关其他信息,这是我的文件夹层次结构:

EDIT For additional information, here is my folder hierarchy:

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 是从网站连接的客户端代码.

The server.js in the my_modules folder is where I start socket.io on the server side. The server.js in the js folder is the client code to connect from the website.

推荐答案

看起来 Socket.IO 无法拦截以 /socket.io/ 开头的请求.这是因为在您的情况下,侦听器是 app -- Express 处理程序.您必须使 http 成为侦听器,以便 Socket.IO 可以访问请求处理.

It looks like Socket.IO can't intercept requests starting with /socket.io/. This is because in your case the listener is app -- an Express handler. You have to make http be listener, so that Socket.IO will have access to request handling.

尝试更换

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

这篇关于socket.io - 无法让它工作,在某种轮询调用中有 404的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆