2011-06-27 31 views
24

Vi que hay un par de hilos similares pero no pude encontrar mi respuesta.Android para comunicación node.js

Estoy haciendo una aplicación android, y quiero usar el nodo como servidor para la comunicación en tiempo real.

Realmente no puedo hacer que esto funcione.

Probablemente estoy haciendo muchas cosas mal pero me gusta tratar de entender.

Mi servidor es tan simple como

var http = require('http'), 
io = require('socket.io'), 
server = http.createServer(function(req, res){ 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.end(':)'); 
}); 
server.listen(8080); 
var socket = io.listen(server); 
socket.on('connection', function(client){ 
    client.send("hello"); 
    console.log("connected!"); 
}); 

y esto funciona ... He intentado esto con una aplicación web y me puedo conectar.

pero no puedo con Java ..

traté kryonet pero me da una excepción como "conectado, pero el tiempo de espera en el registro"

me trató weberknecht me sale un "error al crear zócalo para ws : //184.xxxxxx: 8080 "

Intenté TooTallNate, no tuve suerte, solo llamé al método de Cerrar.

me trataron jWebSocket pero no pude conseguir que funcione ...

Así que estoy aquí, pidiendo ayuda, ¿alguien sabe cómo hacer esto? ¿cualquier sugerencia?

P.S. para TooTallNate estoy usando algo como esto:

Net net = new Net(new URI("ws://184.xxxxxx:8080"),WebSocketDraft.DRAFT76); 

podría ser el problema aquí?

ACTUALIZACIÓN: He manejado esto! después de un buen sueño tuve la idea, estaba usando socket.io, mala idea ... ahora uso Node Websocket Server con weberknecht. El servidor tiene el siguiente aspecto:

var ws = require("websocket-server"); 

var server = ws.createServer(); 

server.addListener("connection", function(client){ 
    console.log("new connection"); 
    client.send("aaaaaa"); 
    client.addListener("message", function(msg){ 
    }); 
}); 

server.listen(8080); 

y el cliente:

try { 
    URI url = new URI("ws://184.106.69.64:8080/"); 
    WebSocket websocket = new WebSocketConnection(url); 
    websocket.setEventHandler(new WebSocketEventHandler() { 
     public void onOpen(){ 
      System.out.println("--open"); 
     }  
     public void onMessage(WebSocketMessage message){ 
      System.out.println("--received message: " + message.getText()); 
     } 
     public void onClose(){ 
      System.out.println("--close"); 
     } 
    }); 

    websocket.connect(); 
    websocket.send("hello world"); 
} 
catch (WebSocketException wse) { 
    wse.printStackTrace(); 
} 
catch (URISyntaxException use) { 
    use.printStackTrace(); 
} 
+5

Creo que el problema es la websocketdraft. Hay 3 borradores por doquier, 76, 00 y 06. Socket.io es bastante vanguardista para estar al día con los borradores nuevos, pero dudo que sean tus bibliotecas Java. – Raynos

+1

si está utilizando una aplicación de Android como cliente en lugar de un navegador, no tiene sentido utilizar websockets. websockets están hechos para configuraciones de servidor/navegador. – eggie5

Respuesta

10

Soy el autor de node-websocket-server (nws), y estoy bastante seguro de la razón por la que node-websocket-server funciona y socket.io no, se debe a la implementación de cada uno. NWS negociará automáticamente el borrador correcto para usar, y también tiene un cumplimiento del 90-100% con los borradores de 76 y 75.

En cuanto a socket.io, no puedo comentar mucho, pero el último Lo busqué, es que la implementación de websocket se implementó bastante mal.

Actualmente estoy trabajando en un proyecto llamado node-websocket-protocol, que será utilizado por socket.io, faye, etc. para proporcionarles una implementación de websocket realmente confiable y conforme. Esto también reemplazará la implementación actual en node-websocket-server en la versión 2.0.0.

Como nota al margen, si prefieres no alojar tu propio servidor websocket, podrías consultar el uso de Pusher.com, que en realidad son mis empleadores.

[Actualizar] En cuanto a si los websockets son la elección tecnológica más adecuada para su aplicación, es una cuestión de qué tipo de datos y de interacción necesita su aplicación. En un dispositivo móvil, puede ser mejor usar algo como empresa o flagship si solo está enviando notificaciones automáticas.

Saludos, Micheil Smith

+0

Muchas gracias por su opinión, sé que tengo una mejor vista de la situación, de todos modos, mi aplicación es un juego y necesita un poco más que notificaciones, ¡gracias por la sugerencia de todos modos! – Duiker101

+0

Sugeriría la biblioteca Android C2DM y el sistema de notificaciones de iPhone, personalmente. Reinventar la rueda a menudo es un dolor de cabeza. – Paddy

+0

@Micheil Smith: ¿Qué proporciona realmente Pusher si puede configurar el servidor node.js y comunicarse con él desde Java con solo unas pocas líneas (como se vio anteriormente en la pregunta)? – caw

2

Como dijo Raynos la especificación WebSocket es todavía un borrador (cambios). Tal vez podría preguntarle a Guillermo Rauch (Author socket.io) qué borrador está usando y encontrar la biblioteca Websocket adecuada. En his github page puede encontrar su dirección de correo electrónico e intentar enviarle un correo electrónico (abreviado).

También podría tratar de usar otro transporte (larga encuesta) e implementar el spec usted mismo supongo.

Pero, en mi opinión, debería usar el c2dm de Google (los reproductores grandes ya lo están usando y será muy cuidadoso con la batería de su teléfono) para enviar actualizaciones al teléfono en tiempo real. Ya tengo muchas aplicaciones instaladas que usan c2dm, como por ejemplo whatsapp (impresionante). Podría estar usando notifo's api para simplificar su trabajo. Luego simplemente instale there android program para recibir las notificaciones deseadas.También hay un node module(npm) disponible para su uso (fácil :))

+1

Yo recomendaría hacer ping en # socket.io en freenode en lugar de correo electrónico. – Raynos

+0

@Raynos que incluso podría ser mejor (más en tiempo real). Esas personas de learnboost rock :) – Alfred

Cuestiones relacionadas