在 Android 上发出 socket.io 消息

Posted

技术标签:

【中文标题】在 Android 上发出 socket.io 消息【英文标题】:Emiting socket.io messages on Android 【发布时间】:2014-11-30 04:34:06 【问题描述】:

我正在尝试使用 socket.io 开发应用程序。有 2 台设备,当有人触摸设备 1 的屏幕时,我需要在设备 2 上看到一条消息。

这是 nodeJS 服务器代码(我使用的是 SocketIO v0.9.*,因为 socket.io-java-client 不支持版本 > 1.0.0)

var app = require('http').createServer()
    var io = require('socket.io').listen(1337);

    io.on('connection', function (socket) 
      socket.on('tiklama', function (data) 
        console.log(data);
        io.emit('tiklama', data);
      );
    );

还有我的 Java 代码(click here 表示整个代码):

protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final RelativeLayout anapanel = (RelativeLayout) findViewById(R.id.anapanel);
        final TextView tw = (TextView) findViewById(R.id.textView1);
        final TextView tw2 = (TextView) findViewById(R.id.textView2);
        final TextView tw4 = (TextView) findViewById(R.id.textView4);

        try 
            socket = new SocketIO("http://SERVERIPADDRESS:1337");
            socket.connect(new IOCallback() 
                @Override
                public void onMessage(JSONObject json, IOAcknowledge ack) 
                    try 
                        Log.d("x","Server said:" + json.toString(2));
                     catch (JSONException e) 
                        e.printStackTrace();
                    
                

                @Override
                public void onMessage(String data, IOAcknowledge ack) 
                    Log.d("x","Server said: " + data);
                

                @Override
                public void onError(SocketIOException socketIOException) 
                    Log.d("x","an Error occured");
                    socketIOException.printStackTrace();
                

                @Override
                public void onDisconnect() 
                    Log.d("x","Connection terminated.");
                

                @Override
                public void onConnect() 
                    Log.d("x","Connection established");
                

                @Override
                public void on(String event, IOAcknowledge ack, Object... args) 
                    Log.d("x","Server triggered event '" + event + "'");

                    if(event.contentEquals("tiklama")) 
                    tw4.setText("Someone touched to device 1");
                    
                
            );

            // This line is cached until the connection is establisched.

         catch (MalformedURLException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        



        anapanel.setOnTouchListener(new OnTouchListener() 

            @Override
            public boolean onTouch(View v, MotionEvent event) 
                // TODO Auto-generated method stub

                if (event.getAction() == MotionEvent.ACTION_DOWN)


                    socket.emit("tiklama", "someoneclicked");
                

                return false;
            
        );

    

所以我的问题是:两个设备都成功连接到 NodeJS 服务器,当我触摸设备上的屏幕时,我在服务器控制台上看到“someoneclicked”消息。但是第二台设备没有收到此消息,LogCat 上也没有发生任何事情。我该如何解决这个问题并与 socket.io 通信这两个设备?

【问题讨论】:

你可以试试io.emit('tiklama', data);,而不是io.sockets.emit('tiklama', data); 【参考方案1】:

由于您使用的是0.9.* 版本的socket.io,因此您需要使用io.sockets.emit 来广播消息。 1.0版本中引入了快捷方式io.emit

改变:

io.emit('tiklama', data);

io.sockets.emit('tiklama', data);

Migration from 0.9 文档说:

快捷方式 一般而言,有一些用于常见事物的新快捷方式。 旧版本应该仍然可以使用,但快捷方式很好。

广播到默认命名空间中的所有客户端

以前:

io.sockets.emit('eventname', 'eventdata');

现在:

io.emit('eventname', 'eventdata');

整洁。请注意,在这两种情况下, 这些消息到达连接到默认“/”的所有客户端 命名空间,但不是其他命名空间中的客户端。

【讨论】:

以上是关于在 Android 上发出 socket.io 消息的主要内容,如果未能解决你的问题,请参考以下文章

在 socket.io 上从客户端捕获所有事件“发出”

socket.io 发出数据将断开客户端

为节点js中的Socket.io中的特定用户发出事件

在 android 上解析 socket.io 数据。 (Gottox Socket.IO)

如果使用 Node.js 在 Socket.io 中的应用程序中登录功能,则为特定用户发出事件

Socket.io 在 Node.js + Redis + Heroku(多个测功机)环境中发出并不总是收到