![](/img/trans.png)
[英]Using Java Socket vs. Apache HttpClient for asynchronous real-time HTTP data gathering
[英]Real-time data transfer between two Androids using Socket.IO (websocket) and 4G
我需要通過4G在兩個Android設備之間進行實時數據傳輸。 我嘗試將httpclient POST和GET與memcache一起使用,但是移動運營商的延遲過大(> 100ms)。 我需要每10毫秒左右刷新一次數據。 所以,我要走網絡套接字的路線。 為了解決這個問題,我花了很多時間進行搜索和挖掘,因此我將發布我正在使用的准系統代碼,以防它對某人有所幫助。 我現在唯一的問題是如何在服務器上使用“昵稱”。 我正在使用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”。
私人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.IO,但仍然有些困惑。 有人會告訴我我需要添加到服務器以及發送變量的設備和接收變量的設備的Java代碼中的代碼嗎? 我知道這只是幾行代碼,但是現在對我來說是遙不可及的。 謝謝你的幫助。
我想出了一種使昵稱對我有用的方法...可能不是最好的方法,但它確實有效。 我發布此解決方案是為了以防將來可能對某人有所幫助(或至少可以節省一些時間)。 對於服務器,我在“連接”事件中添加了以下代碼
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.