2011-06-27 6 views
24

Widziałem kilka podobnych wątków, ale nie mogłem znaleźć odpowiedzi.Android do komunikacji node.js

Robię aplikację na Androida, chcę używać węzła jako serwera do komunikacji w czasie rzeczywistym.

Naprawdę nie mogę tego uruchomić.

Prawdopodobnie popełniam wiele błędów, ale lubię próbować zrozumieć.

Mój serwer jest tak proste jak

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!"); 
}); 

i to działa ... Próbowałem to z aplikacji internetowych i mogę się połączyć.

Ale nie mogę z java ..

Próbowałem kryonet ale otrzymuję wyjątek jak „podłączony, ale czas oczekiwania na rejestrację”

Próbowałem weberknecht dostaję „Błąd podczas tworzenia gniazdo do ws : //184.xxxxxx: 8080 "

Próbowałem TooTallNate, bez powodzenia, to po prostu wywołaj metodę Zamknij.

Próbowałem jWebSocket ale nie mogę zmusić go do pracy ...

Więc jestem tutaj z prośbą o pomoc, czy ktoś wie, jak się to robi? jakieś sugestie?

P.S. dla TooTallNate używam coś takiego:

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

może być tu problem?

AKTUALIZACJA: Zajmowałem się tym! po dobrym śnie wpadłem na pomysł, użyłem socket.io, zły pomysł ... teraz używam Node Websocket Server z weberknecht. Serwer wygląda następująco:

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); 

i klienta:

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

Uważam, że problemem jest websocketdraft. Wokół znajdują się 3 szkice, 76, 00 i 06. Socket.io jest dość krwawym trendem, jeśli chodzi o nadążanie za nowymi wersjami, ale wątpię, aby były to biblioteki Java. – Raynos

+1

jeśli używasz aplikacji na Androida jako klienta zamiast przeglądarki, nie ma sensu korzystać z websockets. websockets są tworzone dla konfiguracji serwera/przeglądarki. – eggie5

Odpowiedz

10

Jestem autorem węzła websocket-server (nws), i jestem prawie pewny, że powód pracy serwera węzłów-websocket i socket.io nie, wynika z implementacji każdego z nich. NWS automatycznie wynegocjuje odpowiedni szkic do użycia, a także ma nadzieję, że 90-100% zgodność z wersjami 76 i 75.

Co do socket.io, nie mogę komentować za dużo, ale ostatnia Wygląda na to, że implementacja websocket była raczej słabo zaimplementowana.

Obecnie pracuję nad projektem o nazwie node-websocket-protocol, który będzie mógł być używany przez socket.io, faye, itp., Aby zapewnić im naprawdę niezawodną i zgodną implementację websocket. To również zastąpi bieżącą implementację w node-websocket-server w wersji 2.0.0.

Na marginesie, jeśli wolałbyś nie obsługiwać własnego serwera WebSocket, możesz spojrzeć na stronę Pusher.com, która w rzeczywistości jest moim pracodawcą.

[Aktualizacja] Jeśli chodzi o to, czy websockets są najbardziej odpowiednim wyborem technologii dla danej aplikacji, to kwestia rodzaju danych i interakcji, jakich potrzebuje Twoja aplikacja. Na urządzeniu mobilnym najlepiej jest użyć czegoś takiego jak urbanairship lub powiadomienie, jeśli tylko wysyłasz powiadomienia push.

Pozdrawiam, Micheil Smith

+0

Dziękuję za opinię, wiem, że mam lepszy widok na sytuację, w każdym razie moja aplikacja jest grą i potrzebuje czegoś więcej niż tylko powiadomień, dzięki za sugestię! – Duiker101

+0

Proponuję osobiście bibliotekę Android C2DM i system powiadomień iPhone'a. Ponowne odkrywanie koła to często ból głowy. – Paddy

+0

@Micheil Smith: Co właściwie zapewnia Pusher, jeśli można skonfigurować serwer node.js i komunikować się z nim z poziomu Java za pomocą zaledwie kilku wierszy (jak pokazano powyżej w pytaniu)? – caw

2

Jak Raynos powiedział spec websocket jest jeszcze projekt (zmiany). Może mógłbyś zapytać Guillermo Raucha (Author socket.io), którego szkic używa i znaleźć właściwą bibliotekę Websocket. Pod adresem his github page możesz znaleźć jego adres e-mail i spróbować wysłać mu e-mail (w skrócie).

Możesz także spróbować użyć innego transportu (długo-pollingu) i wdrożyć spec, jak sądzę.

Ale moim zdaniem powinieneś używać Google c2dm (gracze Big już używają tego i będą bardzo delikatnie do baterii telefonu) zamiast przesyłać aktualizacje do telefonu w czasie rzeczywistym. Mam już wiele zainstalowanych aplikacji, które używają c2dm jak na przykład whatsapp (awesome). Możesz użyć notifo's api, aby uprościć swoją pracę. Następnie po prostu zainstaluj there android program, aby otrzymać żądane powiadomienia.Dostępne jest również node module(npm) (łatwe :))

+1

Polecam pingowanie go w # socket.io na freenode raczej niż e-mail. – Raynos

+0

@Raynos, który może być nawet lepszy (więcej w czasie rzeczywistym). Ci ludzie z learnboost rock :) – Alfred