Android socket通信怎么做到有状态的

在移动端启动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协议的特性,保证消息的顺序传输。具体实现可以参考相关资料或者请专业人士协助处理。