【问题标题】:Socket io client in android using socket io java clientandroid中的socket io客户端使用socket io java客户端
【发布时间】:2014-01-05 14:15:14
【问题描述】:

我有一个节点服务器正在运行。我想用套接字连接到服务器。我正在使用 socket io java 客户端 (https://github.com/Gottox/socket.io-java-client/wiki) 这是我的服务器代码:

var app = require('express')()
 , http = require('http')
 , server = http.createServer(app)
 , io = require('socket.io').listen(server);
io.sockets.on('connection', function(client)
{
console.log("client connected!");
client.emit('messages',{text: 'Hello world!'});
client.on('messages', function(data)
{
    console.log(data);
});
client.on('echo', function(data)
{
    console.log(data);
});
});
server.listen(8080);

这是我的安卓代码:

try {
        SocketIO socket = new SocketIO("http://10.0.2.2:9000/");
        socket.connect(new IOCallback() {

            @Override
            public void onMessage(JSONObject arg0, IOAcknowledge arg1) {
                try {
                    Toast.makeText(MainActivity.this,
                            arg0.getString("text"), Toast.LENGTH_LONG)
                            .show();
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

            @Override
            public void onMessage(String arg0, IOAcknowledge arg1) {
                Toast.makeText(MainActivity.this, arg0, Toast.LENGTH_LONG)
                        .show();

            }

            @Override
            public void onError(SocketIOException arg0) {
                Log.d("tag", arg0.toString());

            }

            @Override
            public void onDisconnect() {
                // TODO Auto-generated method stub

            }

            @Override
            public void onConnect() {
                Toast.makeText(MainActivity.this, "Connected",
                        Toast.LENGTH_LONG).show();

            }

            @Override
            public void on(String event, IOAcknowledge ack, Object... args) {
                if ("echo back".equals(event) && args.length > 0) {
                    Log.d("SocketIO", "" + args[0]);
                    // -> "hello"
                }
            }
        });
        socket.emit("echo", "hello");
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

我的套接字没有连接!我的意思是在android中没有显示吐司。这是我的服务器日志:

 debug - client authorized
   info  - handshake authorized -M9Dcv2a1Gd-LJpkogRF
   debug - setting request GET /socket.io/1/websocket/-M9Dcv2a1Gd-LJpkogRF
   debug - set heartbeat interval for client -M9Dcv2a1Gd-LJpkogRF
   debug - client authorized for 
   debug - websocket writing 1::
client connected!
   debug - websocket writing 5:::{"name":"messages","args":[{"text":"Hello world!"}]}
hello
   info  - transport end (undefined)
   debug - set close timeout for client -M9Dcv2a1Gd-LJpkogRF
   debug - cleared close timeout for client -M9Dcv2a1Gd-LJpkogRF
   debug - cleared heartbeat interval for client -M9Dcv2a1Gd-LJpkogRF
   debug - discarding transport

我的错在哪里?

【问题讨论】:

标签: java android node.js socket.io


【解决方案1】:

可能是因为您将Toast.makeText() 放在了错误的位置。当服务器执行socket.send() 时,客户端上的onMessage() 事件会触发,这主要用于在客户端/服务器之间发送纯文本消息。

当服务器执行socket.emit() 时,客户端将它们监听到on(String event, IOAcknowledge ack, Object.. args) 方法中。因此,将您的 Toast.makeText() 替换为 on() 方法。

    @Override
    public void on(String event, IOAcknowledge ack, Object... args) {
        Object[] arguments = args;
        String json = arguments[0].toString();

        if(event.equalsIgnoreCase("messages")){
              // do something with json.
        }
    }

【讨论】:

  • 为什么 onError(...) 函数会触发?
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2016-06-04
相关资源
最近更新 更多