Obtención de angular-socket-io trabajando con Grunt

Estoy teniendo problemas para que socket.io trabaje con mi proyecto que usa Grunt. Actualmente estoy usando angular-socket-io a través de bower. Así que aquí hay cosas que he hecho hasta aquí:

1) Instalar angular-socket-io y socket.io-client a través de bower

2) Importado las siguientes líneas exactamente en index.html

   

3) Se agregó ‘btford.socket-io’ a mi app.js

 angular.module('angularApp', [ 'ngCookies', 'ngResource', 'ngSanitize', 'ngRoute', 'ui.bootstrap', 'btford.socket-io']) 

4) Hecho archivo Socket.js que es

 app.factory('Socket', ['socketFactory', '$location', function(socketFactory, $location) { if($location.host() === "127.0.0.1") { return socketFactory({ prefix: '', ioSocket: io.connect($location.protocol() + '://' + $location.host() + ':' + $location.port()) }); } else { return socketFactory({ prefix: '', ioSocket: io.connect({path: '/node_modules/socket.io'}) }); } } ]); 

Estructura del proyecto:

 Project | - node_modules | - socket.io - src | - main | - webapp | - app | - bower_components - scripts | - controllers - services - app.js - Socket.js - styles - views - index.html - bower.json - Gruntfile.js - server.js 

Pero me sale el siguiente error en cada encuesta:

 GET http://127.0.0.1:9000/socket.io/?EIO=3&transport=polling&t=1448635105443-105 404 (Not Found) 

¿Qué podría estar mal? ¿Es posible decirle a angular que importe algunos módulos específicos de nodo? He estado buscando una solución para esto desde stackoverflow y también lo busqué en Google muchos días, pero no he encontrado ninguna solución.

Sin embargo, he encontrado que cuando intenta obtener socket.io utilizando esa dirección, intenta obtenerlo de la ruta node_modules. He instalado allí en caso de socket.io a través de npm.

También he leído las instrucciones de angular-socket-io en Github angular-socket-io

EDITAR * He intentado crear server.js que incluye las siguientes líneas:

 var app = require('http').createServer(handler) var io = require('socket.io')(app); var fs = require('fs'); app.listen(9000, "127.0.0.1"); function handler (req, res) { fs.readFile(__dirname + '/src/main/webapp/app/index.html', function (err, data) { if (err) { res.writeHead(500); return res.end('Error loading index.html'); } res.writeHead(200); res.end(data); }); } io.sockets.on('connection', function(socket){ socket.emit('news', {message: 'hello world'}); socket.on('my event', function(data){ console.log(data); }) }) 

Pero todavía dice lo mismo.

Finalmente lo tengo funcionando. Así que aquí está la respuesta para cualquiera que esté ejecutando Grunt como servidor usando grunt serve o grunt connect .

Primero haga los cuatro pasos que se hacen en la pregunta anterior.

En segundo lugar, cuando usa Grunt para ejecutar su servidor, necesita instalar y usar el paquete npm llamado grunt-contrib-connect que tendrá la función onCreateServer . Esta función nos permitirá usar socket.io con Grunt. Esta función se incluye con al menos la versión 0.11.2 de grunt-contrib-connect . Necesitas cargar este paquete en tu archivo Gruntfile. Si aún no lo ha hecho, simplemente puede agregar la siguiente línea a su Gruntfile.js

grunt.loadNpmTasks('grunt-contrib-connect')

Ahora que ha cargado esa tarea npm, ahora puede usar la función onCreateServer para usar socket.io, como esto:

 grunt.initConfig({ connect: { server: { options: { port: 8000, hostname: 'localhost', onCreateServer: function(server, connect, options) { var io = require('socket.io').listen(server); // do something with socket io.sockets.on('connection', function(socket) { io.sockets.on('connection', function(socket) { socket.emit('news', {message: 'hello world'}); socket.on('my event', function(data){ console.log(data); }) }); }); } } } } }); 

Finalmente, puede ir a su controlador y usar su fábrica de sockets que hizo en el lado del cliente (en nuestro caso es Socket.js ). Aquí hay un ejemplo de controlador:

 angular.module('angularApp').controller('MyCtrl', ['$rootScope', '$scope', '$resource', 'Socket', function($rootScope, $scope, $resource, Socket ){ Socket.on('news', function(data){ console.log(data); Socket.emit('my event', {my: 'data'}); }) }]); 

SUGERENCIA: Si está utilizando livereload en su server.options . server.options entonces no tiene que preocuparse por eso. Puedes usar livereload con socket.io .