Android recibe un error mientras se conecta a Socket

Estoy intentando escribir una aplicación simple con nodejs y express.io después de leer un documento de Express.io y una conexión exitosa a http://chat.socket.io . Encuentro una muestra simple para crear el lado del servidor con nodejs y express.io. , después de ejecutar este código a continuación en la línea de comandos y abrir http://localhost:3000 en el navegador, no obtengo ningún error, no puedo encontrar ningún buen documento sobre encoding en el servidor http://chat.socket.io , ahora quiero para intentar enviar la solicitud desde el cliente de Android al servidor con muestras, pero me sale un error de conexión:

Error:

 CONNECTION ERROR 

server.js:

 // Setup basic express server var express = require('express'); var app = express(); var server = require('http').createServer(app); var io = require('../..')(server); var port = process.env.PORT || 3000; server.listen(port, function () { console.log('Server listening at port %d', port); }); // Routing app.use(express.static(__dirname + '/public')); // Chatroom // usernames which are currently connected to the chat var usernames = {}; var numUsers = 0; io.on('connection', function (socket) { var addedUser = false; // when the client emits 'new message', this listens and executes socket.on('new message', function (data) { // we tell the client to execute 'new message' socket.broadcast.emit('new message', { username: socket.username, message: data }); }); // when the client emits 'add user', this listens and executes socket.on('add user', function (username) { // we store the username in the socket session for this client socket.username = username; // add the client's username to the global list usernames[username] = username; ++numUsers; addedUser = true; socket.emit('login', { numUsers: numUsers }); // echo globally (all clients) that a person has connected socket.broadcast.emit('user joined', { username: socket.username, numUsers: numUsers }); }); // when the client emits 'typing', we broadcast it to others socket.on('typing', function () { socket.broadcast.emit('typing', { username: socket.username }); }); // when the client emits 'stop typing', we broadcast it to others socket.on('stop typing', function () { socket.broadcast.emit('stop typing', { username: socket.username }); }); // when the user disconnects.. perform this socket.on('disconnect', function () { // remove the username from global usernames list if (addedUser) { delete usernames[socket.username]; --numUsers; // echo globally that this client has left socket.broadcast.emit('user left', { username: socket.username, numUsers: numUsers }); } }); }); 

mi codigo android

 private Socket mSocket; { try { /* connection successful to http://chat.socket.io */ mSocket = IO.socket("http://localhost:3000"); } catch (URISyntaxException e) { Log.e("Error URI", String.valueOf(e)); throw new RuntimeException(e); } } public void onCreate(Bundle savedInstanceState) { ... mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError); mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError); mSocket.on("new message", onNewMessage); mSocket.on("user joined", onUserJoined); mSocket.on("user left", onUserLeft); mSocket.on("typing", onTyping); mSocket.on("stop typing", onStopTyping); mSocket.connect(); ... Button signInButton = (Button) findViewById(R.id.sign_in_button); signInButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { attemptLogin(); } }); mSocket.on("login", onLogin); } private void attemptLogin() { mUsernameView.setError(null); String username = mUsernameView.getText().toString().trim(); if (TextUtils.isEmpty(username)) { mUsernameView.setError(getString(R.string.error_field_required)); mUsernameView.requestFocus(); return; } mUsername = username; mSocket.emit("add user", username); } 

Error de Android:

 E/AndroidRuntime﹕ FATAL EXCEPTION: EventThread java.lang.IllegalArgumentException: delay < 0: -432345566375051264 at java.util.Timer.schedule(Timer.java:457) at com.github.nkzawa.socketio.client.Manager.reconnect(Manager.java:497) at com.github.nkzawa.socketio.client.Manager.access$2000(Manager.java:20) at com.github.nkzawa.socketio.client.Manager$8$1$1.call(Manager.java:519) at com.github.nkzawa.socketio.client.Manager$1$3.call(Manager.java:282) at com.github.nkzawa.emitter.Emitter.emit(Emitter.java:117) at com.github.nkzawa.engineio.client.Socket.onError(Socket.java:754) at com.github.nkzawa.engineio.client.Socket.access$800(Socket.java:29) at com.github.nkzawa.engineio.client.Socket$4.call(Socket.java:293) at com.github.nkzawa.emitter.Emitter.emit(Emitter.java:117) at com.github.nkzawa.engineio.client.Transport.onError(Transport.java:63) at com.github.nkzawa.engineio.client.transports.PollingXHR.access$100(PollingXHR.java:19) at com.github.nkzawa.engineio.client.transports.PollingXHR$6$1.run(PollingXHR.java:126) at com.github.nkzawa.thread.EventThread$2.run(EventThread.java:75) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) at java.lang.Thread.run(Thread.java:838) 

Yo culparía a esto:

 mSocket = IO.socket("http://localhost:3000"); 

Supongo que no está ejecutando su servidor node.js en su Android, pero probablemente en su PC. Si es así, cuando realiza la prueba en su Android, está intentando conectarse de nuevo en el puerto 3000 a su propio Android, ya que localhost vincula con el dispositivo.

Si está utilizando la misma red local en su servidor y Android, debe verificar la IP de su PC y ponerla en lugar de localhost . Si su servidor tiene IP pública, es posible que desee utilizarlo.


editar

1

En otras palabras, de acuerdo con su comentario: la IP de su PC es 192.168.1.5 . Dado que se trata de una IP interna, su Android debe estar conectado a la misma subred que su PC, solo porque no puede producir su error de conexión. Basándome en eso, asumo que necesita escribir http://192.168.1.5/ en la barra de direcciones de su Android, para visitar la página en la que se encuentra su PC. Suponiendo que uno permanezca sin cambios, la secuencia de comandos “mi código de Android” se está ejecutando en tu Android. Así que en lugar de localhost se requiere un host apropiado: 192.168.1.5 . No puedo saber si su Android está bloqueando el puerto 3000, pero localhost es incorrecto desde el punto de vista de los androids, siempre y cuando no esté ejecutando su servidor nodejs en ese dispositivo.

Además, es posible que el cambio no tenga efecto ad hoc, durante la caché del navegador en dispositivos móviles.

2

Al examinar su código, asumo que también ocurrirán algunos problemas con los usuarios que usan el mismo nombre de usuario. Sí, suena extraño, pero los usuarios pueden querer abrir algunas tabs en el navegador, conectadas al mismo servidor de socket. Una vez hecho esto, las variables de usernames y número de numUsers se corromperán.

Siempre y cuando la aplicación sea de una sola instancia dedicada (por ejemplo, player @ game), usaría

 usernames[username] = socket 

para guardar los sockets a un lado, pudiendo publicar eventos relacionados con jugadores cruzados evitando la iteración en todos los sockets abiertos.

También para fines de chat, es posible que desee permitir que los usuarios se conecten en algunas tabs del navegador a la vez. Por lo general, estoy almacenando todos los sockets de esta manera:

 if (!users[user]) { users[user] = { sockets: [socket] }; console.log(sprintf('[%s] [CONNECTED] User %s', Date(), user)); } else { users[user].sockets.push(socket); } 

puede ser diferente, dependiendo en gran medida de los canales de chat, etc. Al alejar a los oyentes, los sockets me permitieron ejecutar un servidor UDP separado en el mismo archivo de script de nodo. Fue con el propósito de poder monitorear / bloquear / alertar a un solo usuario a través de todas las tabs abiertas, evento si se distribuyen en dos navegadores diferentes.