使用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 楼答案
我想出了一个办法让昵称对我有用。。。也许不是最好的方法,但它是有效的。我发布这个解决方案只是为了防止它在将来帮助某人(或者至少节省一些时间)。对于服务器,我在“连接”事件中添加了以下代码
在Android活动发送数据的代码中,我将这一行添加到了onConnect()中
最后,我更改了Android活动中接收数据的代码,如下所示: