简体   繁体   中英

Android to node.js communication

I saw there are a couple of similar threads but i could not find my answer.

I'm making and android app, an i want to use node as server for real time communication.

I really cannot get this to work.

Probably I'm making many many things wrong but i like to try to understand.

My server is as simple as

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

and this works... I tried this with a web app and I can connect.

But I can't with java..

I tried kryonet but I get an exception like "connected but timeout on registration"

I tried weberknecht I get a "error while creating socket to ws://184.xxxxxx:8080"

I tried TooTallNate , no luck, it just call onClose method.

I tried jWebSocket but I couldn't get it to work...

So I'm here, asking for help, does anyone knows how to get this done? any suggestion?

PS for TooTallNate I'm using something like this:

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

might the problem be here?

UPDATE: I handled this! after a good sleep I had the idea, I was using socket.io, bad idea... now I use Node Websocket Server with weberknecht . The server looks like this:

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

and the client:

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

I'm the author of node-websocket-server (nws), and I'm pretty sure the reason for node-websocket-server working and socket.io not, is due to the implementation of each. NWS will auto negotiate the right draft to use, and it also has a hopefully 90-100% compliance with the drafts of 76 and 75.

As for socket.io, I can't comment too much, but the last I looked, it's websocket implementation was rather poorly implemented.

I'm currently working on a project at the moment called node-websocket-protocol, which will be able to be used by socket.io, faye, etc as to provide them with a really reliable and compliant websocket implementation. This will also replace the current implementation in node-websocket-server in version 2.0.0.

As a side note, if you'd rather not host your own websocket server, you could look at using Pusher.com, who're actually my employers.

[Update] As for whether websockets are the most appropriate technology choice for your application, is a matter of what type of data and interaction your application needs. On a mobile device, it may be best to use something like urbanairship or notifio if you're just sending push notifications.

Regards, Micheil Smith

Like Raynos said the websocket spec is still a draft(changes). Maybe you could ask Guillermo Rauch(Author socket.io) which draft he is using and find the proper Websocket library. At his github page you can find his email address and try to send him an email(short).

You could also try to use another transport(long-polling) and implement the spec yourself I guess.

But in my opinion you should be using Google's c2dm (Big players are already using this and will be very gently to your phone's battery) instead to push updates to phone in realtime. I already have a lot of applications installed that are using c2dm like for example whatsapp (awesome). You could be using notifo's api to simplify your work. Then simply install there android program to receive the desired notifications. There is also a node module(npm) available for you to use (easy :))

I recommend

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM