Подтвердить что ты не робот

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

Client

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, поэтому, возможно, эта проблема, но похоже, что это, вероятно, правильный файл.

Любая помощь здесь?

ИЗМЕНИТЬ Для получения дополнительной информации, вот моя иерархия папок:

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

Сервер .js в папке my_modules - это где я запускаю socket.io на стороне сервера. Server.js в папке js - это клиентский код для подключения с веб-сайта.

4b9b3361

Ответ 1

Похоже, Socket.IO не может перехватывать запросы, начиная с /socket.io/. Это потому, что в вашем случае слушатель app - курьерский обработчик. Вы должны сделать 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

Ответ 2

Просто для проверки, что это ваш сервер или просто проблема с клиентом, вы можете использовать эту сеть: websocket-echo, если этот клиент подключается прямо к вашему сервер (первый клиент формы полезен, если ваш сервер подключен к сети, если он находится на вашем хосте, cuoting from 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": "*"
  }

ура!

Ответ 3

В моем случае я создал свое приложение с Экспресс-генератор приложений. Чтобы решить эту проблему, вместо редактирования файла app.js в корневой папке проекта я отредактировал файл bin/www в строке после определения сервера:

/**
 * Create HTTP server.
 */

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

Обновление

Я нашел лучший способ здесь Express Generator и Socket.io