38

I am writing an application for Android 2.3.5 (that will also be compatible with iOS). I wish to transfer data from the app's HTML/Javascript to a Python program on a server (which uses the Twisted engine to retrieve the data).

I've tried many things and looked at various forums, answers, tutorials, and web pages--including most of them here--and can't find an answer. Here's the relevant Javascript I have in my index.html file:

<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

If you can't tell, I'm still pretty confused how this works; I can't even test anything. The error that keeps coming up is ReferenceError: io is not defined. Some sites used something like var io = require('socket.io');. But then it results in the same error: ReferenceError: require is not defined.

I put the socket-lib folder in assets/www, where any other Javascript source should go. This is also where the index.html file is. Many sites use <script src="/socket.io/socket.io.js"></script>, but this makes no sense to me. Many sites also imply the use of node.js, but I never see it anywhere.

How can I make this work?

Reply edits:

I tried it in Chrome, and it's giving me an Uncaught ReferenceError: require is not defined for the socket.io.js file. So I decide to source in require.js right before it. Then it gives the error Uncaught Error: Module name "socket.io-client" has not been loaded yet for context. Since I'm not using this, I care not. When I try the connection, though, it gives the same io is not defined error. When I define it as var io = require('socket.io'), the error is Error: Module name "socket.io" has not been loaded yet for context: _ http://requirejs.org/docs/errors.html#notloaded. I looked at the website, and it doesn't help me at all. When I try to put "require" as a function argument, another error occurs: TypeError: undefined is not a function.

Ness
  • 1,215
  • 1
  • 9
  • 18
  • 4
    I found the answer, for anyone who gets immensely confused by the horrible lack of documentation of socket.io. You cannot source "/socket-lib/socket.io.js"; you must source "http://yourwebsite.com:12345/socket.io/socket.io.js". The server automagically does the rest for you. – Ness Aug 28 '12 at 13:38
  • you are my new favorite person sir! Their samples on socket.io are horribly misleading. – Jason Welch Nov 17 '12 at 07:23
  • According the documentation, since v1.0 you can request the client library from their CDN: http://socket.io/blog/introducing-socket-io-1-0/#cdn-delivery – maxwell2022 May 30 '14 at 03:13

8 Answers8

62

I found the answer for anyone who gets immensely confused by the horrible lack of documentation of socket.io.

You cannot source /socket-lib/socket.io.js,

you must source http://yourwebsite.com:12345/socket.io/socket.io.js.

The server automatically does the rest for you.

LuxDie
  • 551
  • 5
  • 9
Ness
  • 1,215
  • 1
  • 9
  • 18
  • 2
    And the port (12345) mentioned here is nothing but the port on which node is running with socket.io – siddhusingh Oct 05 '13 at 07:23
  • I had forgot to create `VirtualHost` in `/etc/apache2/httpd.conf` to point the port where my node server was running, in my case it was `...` – mlunoe Feb 11 '14 at 11:53
  • I was getting this error because of line this: was looking like nonsense, cause when I use in fresh html file - it was working, but then tried by parts - use php die() and start from beginning of the file - it was working until I my sockets script went after require.js lib. Eearlier it did not do any harm but maybe when node udpated something - it broke. – Dariux Dec 11 '14 at 15:19
  • Why? This is a client side library, so why does it need to be loaded from the server which you are trying to connect to? Connection params are in the connect method. – Phil Aug 26 '16 at 07:08
  • Because it needs to be loaded from somewhere; you can't expect a browser to automatically have it. In case you're confused about my situation, the website is on the server, so everything is loaded from there anyway. – Ness Aug 29 '16 at 13:33
  • @trust_words Perhaps something else may be wrong with your code? I haven't worked with socket.io in five years, so I can't help much, but I can suggest codebeautify.org/jsvalidate to attempt to find what may be wrong somewhere. – Ness Oct 30 '18 at 21:47
  • 1
    I opened a new directory, installed dependencies and it worked! Sometimes, it's just a bad installation...maybe a broken dependency (or permissions). – salouri Nov 02 '18 at 14:31
6

I solved it myself by changing index.html to import the socket io client from bower, first i installed the bower component:

 bower install socket.io-client

then i changed the reference in index.html to :

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

Or file could be found at - lib/socket.io-client/dist/socket.io.js

shacharsol
  • 2,196
  • 18
  • 14
2

I managed to blunder through this, and squandered about an hour, on something that turned out to be a very basic error.

When an function is not defined? Such as " Uncaught ReferenceError: io is not defined ". Does that not mean that the function is getting "used" before it is "created"?

In the part of my HTML file, that "calls" the javaScript files, it looked like this :

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

and i changed it to this

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

So now the item "io", whether it is an object or function... Is actually getting created before it is getting used :D

Have FUN!

Mat-e
  • 79
  • 3
2

write server side code in socket.io.js file and try src="/socket.io/socket.io.js"

hope this will solve your problem

Sudhakar
  • 485
  • 1
  • 3
  • 14
1

When getting socket.io to work with many other libraries using require.js I had same error, it turned out to be caused because of trying to load the socket.io.js file from the same /js folder than the rest of the other files.

Placing it in a separated folder, fixed it for me, you can see the code in this gist but all I changed for making it work, was this:

instead of:

socketio: 'socket.io',

Use:

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

Not sure about the reason of this behavior, but I hope it helps you.

guerrerocarlos
  • 1,224
  • 12
  • 6
  • Because of the folder structure of the installed socket.io package. It must point the to the root server folder then to the socket.io path – kabuto178 Mar 02 '17 at 14:38
0

This looks like your browser cannot find the socket.io.js file. You could try opening the index.html on your computer with Firefox+Firebug or the Chrome Web Developer Tools and look at how the .js file is requested. On the other side, you could check the logs on the webserver serving the .js file whether there are any file not found errors.

The require function would be provided by e.g. RequireJS, but you would still need to configure the paths to your scripts correctly for it to work.

Stefan Seemayer
  • 1,827
  • 14
  • 21
  • Do you have any other advice? I still can't get this to work. – Ness Aug 20 '12 at 13:30
  • Without actually seeing both your code and your directory structure, it's pretty hard to tell what is wrong. Maybe you could upload your progress so far somewhere? – Stefan Seemayer Aug 20 '12 at 13:57
  • All the code that is relevant is already posted. The problem persists when all other Javascript is taken away. As for the directory structure, it's in Eclipse SDK, and the project is HelloWorld. The file "index.html" and the folder "socket-lib" are both in "HelloWorld/assets/www". The only other important file (I think) would be the Java file: "HelloWorld/src/com.helloworld.helloworld/Hello.java". It was created by default; the only thing I did there was changing the `setContentView()` line to `super.loadUrl("file:///android_asset/www/index.html");`. – Ness Aug 20 '12 at 16:33
0

For me after debugging through all of the very helpful suggestions, it turned out to be simply that my node server had stopped. I had been running it manually in a terminal window during dev.

Make sure your node [yourservercode].js is running on the specified port! :-]

Tim T
  • 361
  • 3
  • 7
0

I use jspm.

Add this:

import 'btford/angular-socket-io/mock/socket-io';
Vitaliy Demchuk
  • 130
  • 1
  • 8