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



我的需求是通过4G在两台Android设备之间进行实时数据传输。我尝试使用httpclient POST和GET与memcache,但移动运营商的延迟太大(>100ms)。我需要每10毫秒左右刷新一次数据。所以,我要走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代码,它将数据发送到我的服务器。我只是把套接字在一个线程,并发送变量"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();
}

下面是Android设备的代码,它正在接收从我的Socket发出的代码。IO服务器…

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

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

我想出了一个让昵称为我工作的方法…也许不是最好的方法,但它有效。我发布这个解决方案只是以防它可能会帮助某人(或至少节省一些时间)在未来。对于服务器,我在'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 activity中接收数据的代码,如下所示:

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

最新更新