使用Socket.IO(websocket)和4G在两个Androids之间进行实时数据传输

时间:2014-05-13 21:56:55

标签: java android node.js sockets

我需要通过4G在两台Android设备之间进行实时数据传输。我尝试使用httpclient POST和GET与memcache,但移动运营商的延迟太大(> 100ms)。我需要每10ms左右刷新一次数据。所以,我要去websocket的路线。我花了很多时间来搜索和挖掘这个解决方案,所以我要发布我使用的准系统代码以防万一它会帮助某人。我现在唯一的问题是如何使用"昵称"与我的服务器。我使用Socket.IO并使用Node.JS创建了我的服务器。这是我服务器的代码......我试图将所有内容尽可能简单地删除,我只是使用一个变量来发布。

var http = require('http');
var url = require('url');
var fs = require('fs');
var server;

server = http.createServer(function(req, res){

}),

send404 = function(res){
    res.writeHead(404);
    res.write('404');
    res.end();
};

server.listen(8001);

// use socket.io
var io = require('socket.io').listen(server);

//turn off debug
io.set('log level', 1);

// define interactions with client
io.sockets.on('connection', function(socket){

    //channel 01 
    socket.on('var', function(data){
        socket.broadcast.emit('var',data); 
        });    
});

这是将数据发送到我的服务器的Android设备的Java代码。我只是将socket放在一个线程中并发送变量" var"。

private void beginChannelSync(){

    if (mysocket != null)
        mysocket.disconnect();

    handler = new Handler();

    // this sets up the server socket
    try {
        mysocket = new SocketIO("http://xx.xxx.xxx.x:8001");
    } catch (MalformedURLException e1) {
        e1.printStackTrace();
    }

    mysocket.connect(new IOCallback() {

        @Override
        public void on(String event, IOAcknowledge arg1, Object... arg2) {
        }

        @Override
        public void onConnect() {
        }

        @Override
        public void onDisconnect() {
        }

        @Override
        public void onError(SocketIOException arg0) {
        }

        @Override
        public void onMessage(String arg0, IOAcknowledge arg1) {
        }

        @Override
        public void onMessage(JSONObject arg0, IOAcknowledge arg1) {
        }

    });

    final Runnable r = new Runnable() {
        public void run() {

            mysocket.emit("var", "some string here");

        }
    };
    syncthread = new Thread() {
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    sleep(10); // milliseconds
                    handler.post(r);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
            }

        }

    };
    syncthread.start();
}

以下是接收从我的Socket.IO服务器发出的代码的Android设备的代码......

// get data stream from DAQ on socket.io server
private class GetData extends AsyncTask<String, Integer, Double> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Double doInBackground(String... params) {

        try {
            mysocket2 = new SocketIO("http://xx.xxx.xxx.x:8001");
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }

        mysocket2.connect(new IOCallback() {

            @Override
            public void on(String event, IOAcknowledge arg1, Object... arg2) {

                Object[] arguments = arg2;
                jsonmsg = arguments[0].toString();

                if (event.equals("var")) {
                    myvar = jsonmsg;
                }

                // this makes call to progress so UI can be updated
                int values = 1;
                publishProgress(values);
            }

            @Override
            public void onConnect() {
            }

            @Override
            public void onDisconnect() {
            }

            @Override
            public void onError(SocketIOException arg0) {
            }

            @Override
            public void onMessage(String arg0, IOAcknowledge arg1) {

            }

            @Override
            public void onMessage(JSONObject arg0, IOAcknowledge arg1) {

            }

        });

        return null;

    }

    protected void onPostExecute(Double result) {

    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // this is where UI gets updated while getting data stream

        tvVar.setText("Var: " + myvar);


        super.onProgressUpdate(values);
    }

}

使用上面的代码时,一切都很好。我的问题是如何实现&#34;昵称&#34;这样可以有许多用户拥有两个Android设备。我在互联网上搜索了代码并找到了一个聊天示例,但我还没有完全掌握昵称的工作原理。我访问过Socket.IO,但仍然有点困惑。有人会告诉我需要添加到我的服务器的代码以及发送变量的设备和接收变量的设备的Java代码吗?我知道这只是几行代码,但现在对我来说是难以捉摸的。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我找到了让昵称对我有用的方法......可能不是最好的方法,但它有效。我发布这个解决方案,以防万一它可能会帮助某人(或至少节省一些时间)。对于服务器,我在'connection'事件中添加了以下代码

socket.on('set nickname', function (name) {
    socket.set('nickname', name, function () {
    socket.nickname=name;
      socket.emit('ready');
    });
  });


  //code for transferring channel data to client  
    socket.on('var', function(data){
        socket.broadcast.emit('var',{user: socket.nickname, message:data});
    }); 

在发送数据的Android活动的代码中,我将此行添加到onConnect()

@Override
    public void onConnect() {

        mysocket.emit("set nickname", "Danica");

    }

最后,我更改了接收数据的Android活动中的代码,如下所示:

mysocket.connect(new IOCallback() {

                @Override
                public void on(String event, IOAcknowledge arg1, Object... arg2) {

                    JSONObject jo = null;
                    String user = "";
                    Object[] arguments = arg2;
                    jsonmsg = arguments[0].toString();
                    try {
                        jo = new JSONObject(jsonmsg);
                        user = jo.getString("user");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }



                                    if (user.equals("Danica")) {



                                        if (event.equals("var")) {
                                    try {
                                        var = jo.getString("message");
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }
                        }
}

                    // this makes call to progress so UI can be updated
                    int values = 1;
                    publishProgress(values);
                }