Android与node.js的通信

27

我看到有几个类似的主题,但我找不到我的答案。

我正在制作一个Android应用程序,并且想要使用Node作为实时通信的服务器。

我真的无法让它起作用。

可能我做错了很多事情,但我想尝试理解。

我的服务器非常简单

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

这个可以用……我用一个Web应用程序试过,我可以连接。

但是我用Java就不行……

我试过 kryonet 但是我会得到一个异常,如“已连接但注册超时”

我试过 weberknecht 我得到一个“在创建套接字到ws://184.xxxxxx:8080时出错”

我试过 TooTallNate,没有成功,它只调用了 onClose 方法。

我试过 jWebSocket 但我无法让它工作……

所以我在这里请求帮助,有人知道如何完成这个吗?有什么建议吗?

P.S. 对于 TooTallNate,我正在使用类似于这样的东西:

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

这里可能出现问题吗?

更新: 我解决了!睡了一晚上后,我想到了一个主意,我之前使用的是socket.io,这是个坏主意...现在我使用Node Websocket Serverweberknecht。服务器看起来像这样:

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

和客户端:

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
我认为问题在于websocketdraft。目前有3个草案,编号分别是76、00和06。Socket.io一直在跟进新草案,但我怀疑你使用的Java库没有这么及时更新。 - Raynos
1
如果您使用的是Android应用程序作为客户端而不是浏览器,那么使用Websockets就没有意义了。 Websockets是专为服务器/浏览器设置而设计的。 - eggie5
3个回答

12

我是node-websocket-server(nws)的作者,我相信node-websocket-server能够工作而socket.io不能的原因是由于它们各自的实现方式。NWS将自动协商使用正确的草案,并且它还具有对76和75草案的90-100%的兼容性。

至于socket.io,我不能发表太多评论,但我最后一次查看时,它的websocket实现方式相当糟糕。

我目前正在进行一个名为node-websocket-protocol的项目,socket.io、faye等都可以使用它来提供一个真正可靠和符合规范的websocket实现。这也将在node-websocket-server 2.0.0版本中替换当前的实现。

顺便说一句,如果您不想托管自己的websocket服务器,您可以考虑使用Pusher.com,他们实际上是我的雇主。

[更新]至于WebSockets是否是您的应用程序最合适的技术选择,这取决于您的应用程序需要什么类型的数据和交互。在移动设备上,如果您只是发送推送通知,最好使用urbanairship或notifio之类的东西。

敬礼, Micheil Smith


非常感谢您的意见,现在我对情况有了更好的了解。无论如何,我的应用是一个游戏,需要的不仅仅是通知,还需要更多东西。不管怎样,还是感谢您的建议! - Duiker101
我个人建议使用Android C2DM库和iPhone通知系统。重新发明轮子常常会带来麻烦。 - Paddy
@Micheil Smith:如果您可以设置node.js服务器并使用几行代码(如上所述),从Java与其通信,那么Pusher实际上提供了什么? - caw

2
像Raynos所说的那样,WebSocket规范仍然是一个草案(变化中)。也许你可以问问Guillermo Rauch(socket.io的作者),他在使用哪个草案,并找到合适的WebSocket库。在他的Github页面上,你可以找到他的电子邮件地址,试着给他发一封简短的邮件。
你也可以尝试使用另一种传输方式(长轮询),并自己实现规范
但在我看来,你应该使用Google的c2dm(大型企业已经在使用它了,对你手机的电池非常友好)来实时推送更新到手机上。我已经安装了很多使用c2dm的应用程序,比如whatsapp(超棒)。你可以使用notifo的API来简化你的工作。然后只需安装他们的Android程序即可接收所需的通知。还有一个Node.js模块(npm)可供你使用(非常简单:))。

1
我建议你在freenode的#socket.io频道中ping他,而不是通过电子邮件联系他。 - Raynos
@Raynos,那甚至可能更好(更实时)。那些来自LearnBoost的人真棒 :) - Alfred

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接