2012-08-16 28 views
26

Estoy escribiendo una aplicación para Android 2.3.5 (que también será compatible con iOS). Deseo transferir datos del HTML/Javascript de la aplicación a un programa de Python en un servidor (que usa el motor Twisted para recuperar los datos).socket.io - ReferenceError: io no está definido

He intentado muchas cosas y he consultado varios foros, respuestas, tutoriales y páginas web, incluida la mayoría de ellos aquí, y no puedo encontrar una respuesta. Aquí está el Javascript relevante que tengo en mi archivo index.html:

<script src="socket-lib/socket.io.js"></script> 
<script type="text/javascript" charset="utf-8"> 
function sendData() { 
    try { 
     var socket = io.connect('http://mywebsite.com:12345'); 
     socket.on('connect', function(data) { 
      socket.send('Hello.'); 
      socket.on('message', function (msg) { 
       socket.send('This is where I send data?'); 
      }); 
     }); 
    } 
    catch(err) { 
     alert('ERROR: socket.io encountered a problem:\n\n' + err); 
    } 
} // end of sendData 

Si no se puede decir, todavía estoy muy confundido cómo funciona esto; Ni siquiera puedo probar nada. El error que sigue apareciendo es ReferenceError: io is not defined. Algunos sitios usaron algo como var io = require('socket.io');. Pero luego se produce el mismo error: ReferenceError: require is not defined.

Puse la carpeta socket-lib en assets/www, donde debería ir cualquier otra fuente de Javascript. Aquí también está el archivo index.html. Muchos sitios usan <script src="/socket.io/socket.io.js"></script>, pero esto no tiene sentido para mí. Muchos sitios también implican el uso de node.js, pero nunca lo veo en ningún lado.

¿Cómo puedo hacer esto?

Responder edita:

Lo he probado en Chrome, y me está dando una Uncaught ReferenceError: require is not defined para el archivo socket.io.js. Así que decido fuente en require.js justo antes. Luego da el error Uncaught Error: Module name "socket.io-client" has not been loaded yet for context. Como no estoy usando esto, no me importa. Sin embargo, cuando intento la conexión, aparece el mismo error io is not defined. Cuando lo defino como var io = require('socket.io'), el error es Error: Module name "socket.io" has not been loaded yet for context: _ http://requirejs.org/docs/errors.html#notloaded. Miré el sitio web, y no me ayuda en absoluto. Cuando intento poner "require" como argumento de función, ocurre otro error: TypeError: undefined is not a function.

+3

he encontrado la respuesta, para cualquier persona que se ve enormemente confundido por la terrible falta de documentación de socket.io. No puede fuente "/socket-lib/socket.io.js"; debe obtener "http://supportweb.com:12345/socket.io/socket.io.js". El servidor automáticamente hace el resto por ti. – Ness

+0

eres mi nueva persona favorita señor! Sus muestras en socket.io son terriblemente engañosas. – Xealgo

+0

Según la documentación, desde v1.0 puede solicitar la biblioteca del cliente desde su CDN: http: // socket.io/blog/introducing-socket-io-1-0/# cdn-delivery – maxwell2022

Respuesta

49

Encontré la respuesta para cualquiera que se sienta inmensamente confundido por la horrible falta de documentación de socket.io.

No puede fuente /socket-lib/socket.io.js,

debe fuente http://yourwebsite.com:12345/socket.io/socket.io.js.

El servidor hace el resto automáticamente por usted.

+1

Y el puerto (12345) mencionado aquí no es más que el puerto en el que se ejecuta el nodo con socket.io – siddhusingh

+0

Me olvidé de crear 'VirtualHost' en'/etc/apache2/httpd.conf' para señalar el puerto donde mi nodo el servidor se estaba ejecutando, en mi caso era ' ...' – mlunoe

+0

Estaba obteniendo este error debido a la línea this: parecía una tontería, porque cuando uso en un archivo html nuevo - estaba funcionando, pero luego lo intenté por partes - uso php die() y comienzo desde el comienzo del archivo - estaba funcionando hasta que mi script sockets fue después de require.js lib. Antes no causaba ningún daño, pero tal vez cuando el nodo eructó algo, se rompió. –

0

Parece que su navegador no puede encontrar el archivo socket.io.js. Puedes intentar abrir el archivo index.html en tu computadora con Firefox + Firebug o las herramientas para desarrolladores web de Chrome y ver cómo se solicita el archivo .js. Por otro lado, puede verificar los registros en el servidor web que sirve el archivo .js, ya sea que haya algún error de archivo no encontrado.

La función require sería proporcionada por, p. Ej. RequireJS, pero aún necesitaría configurar las rutas a sus scripts correctamente para que funcionen.

+0

¿Tiene algún otro consejo? Todavía no puedo hacer que esto funcione. – Ness

+0

Sin ver realmente tanto su código como su estructura de directorios, es bastante difícil determinar qué es lo que está mal. ¿Tal vez podrías subir tu progreso hasta ahora en algún lado? –

+0

Todo el código relevante ya está publicado. El problema persiste cuando se quitan todos los demás Javascript. En cuanto a la estructura del directorio, está en Eclipse SDK, y el proyecto es HelloWorld. El archivo "index.html" y la carpeta "socket-lib" están ambos en "HelloWorld/assets/www". El único otro archivo importante (creo) sería el archivo Java: "HelloWorld/src/com.helloworld.helloworld/Hello.java". Fue creado por defecto; lo único que hice fue cambiar la línea 'setContentView()' a 'super.loadUrl (" file: ///android_asset/www/index.html ");'. – Ness

0

Al hacer que socket.io funcione con muchas otras bibliotecas usando require.js tuve el mismo error, resultó ser debido a intentar cargar el archivo socket.io.js desde la misma carpeta/js que el resto de los otros archivos.

Si lo coloca en una carpeta separada, fijada por mí, se puede ver la code in this gist pero todo lo que cambiado para hacer que funcione, fue esto:

en lugar de:

socketio: 'socket.io',

Uso :

socketio: '../socket.io/socket.io',

No estoy seguro del motivo de este comportamiento, pero espero que lo ayude.

+0

Debido a la estructura de carpetas del paquete socket.io instalado. Debe apuntar a la carpeta del servidor raíz y luego a la ruta de socket.io – kabuto178

0

Me las arreglé para cometer errores, y desperdicié alrededor de una hora, en algo que resultó ser un error muy básico.

¿Cuando una función no está definida? Tales como "Unbeught ReferenceError: io no está definido". ¿Eso no significa que la función se está "utilizando" antes de "crearse"?

En la parte de mi archivo HTML, que las "llamadas" los archivos JavaScript, que parecían así:

<script src='./js/playerChatter.js'></script> <!-- this one calls io --> 
<script src="http://localhost:2019/socket.io/socket.io.js"></script><!-- This Creates io --> 

y yo cambiado a este

<script src="http://localhost:2019/socket.io/socket.io.js"></script> <!-- This Creates io --> 
<script src='./js/playerChatter.js'></script> <!-- this on calls io --> 

Así que ahora el ítem "io", si es un objeto o función ... En realidad se está creando befo re se está usando: D

Have FUN!

0

Para mí después de la depuración a través de todas las sugerencias muy útiles, resultó ser simplemente que mi servidor de nodos se había detenido. Lo había estado ejecutando manualmente en una ventana de terminal durante el desarrollo.

¡Asegúrese de que su nodo [yourservercode] .js se esté ejecutando en el puerto especificado! : -]

5

lo resolví yo mismo cambiando index.html importar la toma io cliente desde la glorieta, en primer lugar he instalado el componente Bower:

bower install socket.io-client 

entonces he cambiado la referencia en index.html a:

<script src="bower_components/socket.io-client/socket.io.js"></script> 

O archivo se puede conocer en - lib/socket.io-cliente/dist/socket.io.js

0

utilizo jspm.

Añadir este:

import 'btford/angular-socket-io/mock/socket-io';