有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我需要的是通过4G在两台Android设备之间进行实时数据传输。我尝试使用httpclient POST and GET with memcache,但移动运营商的延迟太大(>;100ms)。我需要每隔10毫秒左右刷新一次数据。所以,我要走websocket的路线。我花了大量的搜索和挖掘才想出这个解决方案,所以我将发布我正在使用的基本代码,以防它会帮助别人。我现在唯一的问题是如何在我的服务器上使用“昵称”。我用的是插座。IO并使用节点创建了我的服务器。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”

私有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设备。我在互联网上搜索了代码并找到了一个聊天示例,但我还没有完全掌握这个昵称是如何工作的。我参观了插座。伊奥,但还是有点困惑。是否有人会向我展示我需要添加到服务器的代码,以及发送变量的设备和接收变量的设备的Java代码?我知道这只是几行代码,但现在对我来说是难以捉摸的。谢谢你的帮助


共 (1) 个答案

  1. # 1 楼答案

    我想出了一个办法让昵称对我有用。。。也许不是最好的方法,但它是有效的。我发布这个解决方案只是为了防止它在将来帮助某人(或者至少节省一些时间)。对于服务器,我在“连接”事件中添加了以下代码

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