以错误的时间顺序收到的 HTTP 请求
HTTP requests received in wrong time sequence
我正在创建一个 Android 应用程序,它使用 Handler 和 Runnable 每 20 毫秒发送一次包含 IMU 数据的 http 请求。
public void onClickLogData(View view){
Log.d(TAG,"onClickLogData");
final OkHttpClient client = new OkHttpClient();
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (Running) {
handler.postDelayed(this, 20);
String url = "http://192.168.86.43:5000/server";
Log.d(TAG, String.valueOf(time));
RequestBody body = new FormBody.Builder()
.add("Timestamp", String.valueOf(time))
.add("accx", String.valueOf(accx))
.add("accy", String.valueOf(accy))
.add("accz", String.valueOf(accz))
.add("gyrox", String.valueOf(gyrox))
.add("gyroy", String.valueOf(gyroy))
.add("gyroz", String.valueOf(gyroz))
.add("magx", String.valueOf(magx))
.add("magy", String.valueOf(magy))
.add("magz", String.valueOf(magz))
.build();
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
final Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.i("onFailure", e.getMessage());
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response)
throws IOException {
assert response.body() != null;
String result = response.body().string();
Log.i("result", result);
}
});
} else {
handler.removeCallbacks(this);
}
}
};
handler.postDelayed(runnable, 1000);
}
并且数据被接收并存储在我的笔记本电脑上。
with open('imu.csv','w') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(['Timestamp','accx','accy','accz','gyrox','gyroy','gyroz','magx','magy','magz'])
app = Flask(__name__)
@app.route('/server', methods=['GET','POST'])
def server():
r = request.form
data = r.to_dict(flat=False)
t = int(str(data['Timestamp'])[2:-2])
print(t)
accx = float(str(data['accx'])[2:-2])
accy = float(str(data['accy'])[2:-2])
accz = float(str(data['accz'])[2:-2])
gyrox = float(str(data['gyrox'])[2:-2])
gyroy = float(str(data['gyroy'])[2:-2])
gyroz = float(str(data['gyroz'])[2:-2])
magx = float(str(data['magx'])[2:-2])
magy = float(str(data['magy'])[2:-2])
magz = float(str(data['magz'])[2:-2])
imu_data = [t,accx,accy,accz,gyrox,gyroy,gyroz,magx,magy,magz]
with open('imu.csv','a+') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(imu_data)
return("ok")
if __name__ == '__main__':
app.run(host='0.0.0.0')
如日志所示,Android 端按时间顺序发送请求,但在接收端,许多请求按错误的时间顺序接收。 enter image description here
随着时间的推移,这种情况似乎越来越频繁。这可能是什么原因造成的,我应该查看哪里?
各种各样的事情。请求通过网络发送。他们每次都可以采取不同的路径到达那里。请求甚至会丢失。使用 TCP,您会自动重新发送丢失的请求,但这样会更加混乱。它们可以在不同网桥和路由器的网络中延迟。互联网上没有承诺会按顺序接收不同的请求。这只是对使用 TCP 的单个套接字的承诺,并且只有通过大量工作才能实现(基本上跟踪发送和接收的每个数据包并等待直到您拥有它们以便将其发送到应用程序)。如果您的体系结构要求您按顺序接收它们,则您的体系结构不可能在 Internet 上工作。
如果您确实需要在服务器上进行排序,请嵌入单调递增的请求编号,或者在请求中嵌入时间戳。
我正在创建一个 Android 应用程序,它使用 Handler 和 Runnable 每 20 毫秒发送一次包含 IMU 数据的 http 请求。
public void onClickLogData(View view){
Log.d(TAG,"onClickLogData");
final OkHttpClient client = new OkHttpClient();
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (Running) {
handler.postDelayed(this, 20);
String url = "http://192.168.86.43:5000/server";
Log.d(TAG, String.valueOf(time));
RequestBody body = new FormBody.Builder()
.add("Timestamp", String.valueOf(time))
.add("accx", String.valueOf(accx))
.add("accy", String.valueOf(accy))
.add("accz", String.valueOf(accz))
.add("gyrox", String.valueOf(gyrox))
.add("gyroy", String.valueOf(gyroy))
.add("gyroz", String.valueOf(gyroz))
.add("magx", String.valueOf(magx))
.add("magy", String.valueOf(magy))
.add("magz", String.valueOf(magz))
.build();
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
final Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.i("onFailure", e.getMessage());
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response)
throws IOException {
assert response.body() != null;
String result = response.body().string();
Log.i("result", result);
}
});
} else {
handler.removeCallbacks(this);
}
}
};
handler.postDelayed(runnable, 1000);
}
并且数据被接收并存储在我的笔记本电脑上。
with open('imu.csv','w') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(['Timestamp','accx','accy','accz','gyrox','gyroy','gyroz','magx','magy','magz'])
app = Flask(__name__)
@app.route('/server', methods=['GET','POST'])
def server():
r = request.form
data = r.to_dict(flat=False)
t = int(str(data['Timestamp'])[2:-2])
print(t)
accx = float(str(data['accx'])[2:-2])
accy = float(str(data['accy'])[2:-2])
accz = float(str(data['accz'])[2:-2])
gyrox = float(str(data['gyrox'])[2:-2])
gyroy = float(str(data['gyroy'])[2:-2])
gyroz = float(str(data['gyroz'])[2:-2])
magx = float(str(data['magx'])[2:-2])
magy = float(str(data['magy'])[2:-2])
magz = float(str(data['magz'])[2:-2])
imu_data = [t,accx,accy,accz,gyrox,gyroy,gyroz,magx,magy,magz]
with open('imu.csv','a+') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(imu_data)
return("ok")
if __name__ == '__main__':
app.run(host='0.0.0.0')
如日志所示,Android 端按时间顺序发送请求,但在接收端,许多请求按错误的时间顺序接收。 enter image description here
随着时间的推移,这种情况似乎越来越频繁。这可能是什么原因造成的,我应该查看哪里?
各种各样的事情。请求通过网络发送。他们每次都可以采取不同的路径到达那里。请求甚至会丢失。使用 TCP,您会自动重新发送丢失的请求,但这样会更加混乱。它们可以在不同网桥和路由器的网络中延迟。互联网上没有承诺会按顺序接收不同的请求。这只是对使用 TCP 的单个套接字的承诺,并且只有通过大量工作才能实现(基本上跟踪发送和接收的每个数据包并等待直到您拥有它们以便将其发送到应用程序)。如果您的体系结构要求您按顺序接收它们,则您的体系结构不可能在 Internet 上工作。
如果您确实需要在服务器上进行排序,请嵌入单调递增的请求编号,或者在请求中嵌入时间戳。