在移动端启动socket为防止阻塞需要多线程中进行,但是又需要一个消息机制往外发,如果网络延迟两次请求返回的顺序可能改变了,见下面例子
移动端:(_代码不用细看,我精简了大量的冗余内容_)
//发送登录
public class cLogIn extends Thread {
@Override
public void run() {
outputStream = socket.getOutputStream();
outputStream.write(sDataJson.toString().getBytes());
outputStream.flush();//发出登录请求
}
//接收数据
private class Receive extends Thread{
inputStream = socket.getInputStream();
@Override
public void run() {
while (bSocket){
byte[] buffer = new byte[512];
String str;
try {
inputStream.read(buffer);
str = new String(buffer,"UTF-8").trim();
} catch (IOException e) {
throw new RuntimeException(e);
}
Message message = Message.obtain();
message.what = iRequest;//1 for login;2 for sth else//公共变量
message.obj=str;
handler.sendMessage(message);//向线程外传出数据
}}}
//转收消息
public class MyHandler extends Handler
{
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:{
Log.d("TAG","Login MSG:"+msg.obj);//登录成功!
//更改UI
break;
case 2:
Log.d("TAG","222222");//测试二号
break;
/......
发送一条登录消息,会正常收到消息,一切正常
但是如果我再发送一条查询别的语句,我将消息message.what = iRequest;值改为2,也是可以正常传出来被case 2:分拣到;
但是我总觉很怪异!Android就是这样工作的?
如果我快速发送十种不同的请求,这些消息总会因网络延迟而“串线”吧?!
参考GPT和自己的思路:你的疑虑是合理的。在使用Socket通信时,由于网络延迟等原因,一些消息可能会因为传输时间不同而乱序到达。为了处理这种情况,通常需要对发送的消息进行编号,并在接收端进行排序。例如,可以在发送消息时增加一个序列号,接收端在接收消息时按照序列号进行排序,确保消息的顺序正确。此外,还可以利用TCP协议的特性,保证消息的顺序传输。具体实现可以参考相关资料或者请专业人士协助处理。