socket.io - 无法在某种轮询电话上使用404

时间:2014-07-17 00:58:37

标签: node.js express socket.io pug

我试图使用socket.io设置服务器,效果不佳。

我主要关注本指南,虽然它有些过时了: http://www.williammora.com/2013/03/nodejs-tutorial-building-chatroom-with.html

socket.io带来问题,我不确定它是客户端还是服务器端。它似乎试图不断轮询服务器,但正在回归404。这听起来像socket.io并没有运行,但这一切对我来说都没问题。它也可能与路径有关,并且有一个" public"目录,但我真的不知道。

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的客户端/ socket.io.js

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

这里有任何帮助吗?

修改 有关其他信息,请参阅我的文件夹层次结构:

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

3 个答案:

答案 0 :(得分:60)

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

尝试替换

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

答案 1 :(得分:5)

就我而言,我使用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

找到了更好的方法

答案 2 :(得分:2)

只是为了检查您的服务器或客户端问题,您可以使用此网站: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": "*"
  }

喝彩!