0

カスタム非同期ネットワークで動作するAndroidのクライアントを取得しました。正常に動作し、正常に受信します。しかし、ある時点で、サーバーはほぼ同時に2つのメッセージを送信しています(サーバー内の2つの異なるスレッド)しかし、クライアントでは、それが発生した場合、解析中に受信を継続するために、すでにrunnableを使用しようとした最初のメッセージのみを受信しますメッセージですが、成功しませんでした。誰かが私を助けてくれるなら、どうすればこの問題を解決できますか。

私の受信コード:

    interface RecieveCallback {
    void callback(int recievedBytes, InputStream stream);
}


public class Recieve implements Runnable {
    private RecieveCallback callback;
    private InputStream stream;
    private byte[] buffer;

    public Recieve(InputStream inStream, byte[] _buffer, RecieveCallback _callback) {
        callback = _callback;
        stream = inStream;
        buffer = _buffer;
    }


    public void run() {
        try {
            while (true) {
                final int recievedBytes = stream.read(buffer);
                (new Runnable() {

                    public void run() {
                        callback.callback(recievedBytes, stream);                       
                    }
                }).run();       
            }
        } catch (IOException e) {
            Log.e("Recieve", e.getMessage());
        }
    }

}



public Connection() {
    this(host, port);
}

public Connection(String ip, int _port) {
    inMessage = new NetworkMessage();
    try {
        serverAddres = InetAddress.getByName(ip);
        socket = new Socket(serverAddres, _port);
        socketOut = socket.getOutputStream();
    } catch (IOException e) {
        Log.e("Connect", e.getMessage());
    }
}

public void Connect() {
    try {
        BeginRecieve(socket.getInputStream(), inMessage.getBuffer(), new RecieveCallback() {            
            public void callback(int recievedBytes, InputStream stream) {
                OnRecieve(recievedBytes, stream);               
            }
        });
    } catch (IOException e) {
        Log.e("BeginRecieve", e.getMessage());
    }
}

public boolean EndRead(int recievedBytes, InputStream stream) {
    int size = (int)inMessage.GetUInt32() + 4;

    while (recievedBytes < size) {
        try {
            recievedBytes += stream.read(inMessage.getBuffer(), recievedBytes, (size - recievedBytes));
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    inMessage.setLength(size);

    return true;
}

public void OnRecieve(int recievedBytes, InputStream stream) {
    inMessage.setPosition(0);

    if (!EndRead(recievedBytes, stream)) {
        return;
    }

    NetworkMessage tempMessage = inMessage;

    if (!ParseMessage(tempMessage)) {
        //Tratar erro
    }
}


public void BeginRecieve(InputStream inStream, byte[] _buffer, RecieveCallback _callback) {
    if (beginRecieve != null && beginRecieve.isAlive()) {
        beginRecieve.interrupt();
    }

    beginRecieve = new Thread(new Recieve(inStream, _buffer, _callback));
    beginRecieve.start();
}
4

1 に答える 1

0

私は解決策を得ました。問題は、クライアントが同じバッファで両方のメッセージを受信して​​いたことでした。ただし、最初のメッセージしか処理しないため、同じバッファーに複数のメッセージが含まれるようにコードを変更し、すべてのメッセージを1つのメッセージに入れて、同じように解析できるようにする必要がありました。

于 2012-09-21T15:41:09.427 に答える