【问题标题】:Android to node.js communicationAndroid 到 node.js 的通信
【发布时间】:2011-09-23 21:07:57
【问题描述】:

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

我正在制作安卓应用程序,我想使用节点作为服务器进行实时通信。

我真的无法让它工作。

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

我的服务器很简单

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

这行得通...我用一个网络应用程序试过这个,我可以连接。

但是我不能用 java..

我尝试了kryonet,但出现“已连接但注册超时”之类的异常

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

我试过TooTallNate,没有运气,它只是调用了onClose方法。

我尝试了jWebSocket,但我无法让它工作......

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

附: 对于 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();
}

【问题讨论】:

  • 我相信问题出在 websocketdraft 上。周围有 3 个草稿,76、00 和 06。Socket.io 在跟上新草​​稿方面非常先进,但我怀疑你的 Java 库是。
  • 如果您使用安卓应用程序作为客户端而不是浏览器,那么使用 websocket 毫无意义。 websockets 是为服务器/浏览器设置而设计的。

标签: java android node.js websocket


【解决方案1】:

我推荐

【讨论】:

    【解决方案2】:

    我是 node-websocket-server (nws) 的作者,我很确定 node-websocket-server 工作而 socket.io 不工作的原因是由于每个的实现。 NWS 将自动协商使用正确的草案,并且它还有望 90-100% 遵守 76 和 75 的草案。

    关于socket.io,我不能过多评论,但我最后看了一下,它的websocket实现相当糟糕。

    我目前正在开发一个名为 node-websocket-protocol 的项目,socket.io、faye 等将能够使用该项目,为他们提供真正可靠且合规的 websocket 实现。这也将替换 2.0.0 版本中 node-websocket-server 中的当前实现。

    附带说明,如果您不想托管自己的 websocket 服务器,可以考虑使用 Pusher.com,它实际上是我的雇主。

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

    问候, 米歇尔·史密斯

    【讨论】:

    • 非常感谢您的意见,知道我对情况有更好的了解,无论如何我的应用程序是一个游戏,需要的不仅仅是通知,无论如何感谢您的建议!
    • 我个人建议使用 Android C2DM 库和 iPhone 通知系统。重新发明轮子通常是一件令人头疼的事情。
    • @Micheil Smith:如果您可以设置 node.js 服务器并通过 Java 与它进行通信,只需几行(如上面的问题所示),Pusher 实际提供了什么?
    【解决方案3】:

    就像 Raynos 所说的 websocket 规范仍然是一个草案(更改)。也许您可以询问 Guillermo Rauch(作者 socket.io)他正在使用哪个草案并找到合适的 Websocket 库。在his github page你可以找到他的电子邮件地址并尝试给他发送电子邮件(短)。

    我猜你也可以尝试使用另一个传输(长轮询)并自己实现spec

    但在我看来,你应该使用谷歌的c2dm(大玩家已经在使用它,并且会对你手机的电池非常温和)而不是实时推送更新到手机。我已经安装了很多使用 c2dm 的应用程序,例如 whatsapp(awesome)。您可以使用notifo's api 来简化您的工作。然后只需安装there android program 即可接收所需的通知。还有一个node module(npm) 供您使用(简单:))

    【讨论】:

    • 我建议在 freenode 上的 #socket.io 中 ping 他,而不是通过电子邮件。
    • @Raynos 可能会更好(更实时)。来自 learnboost rock 的那些人 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多