0
내 비동기 네트워크와 함께 안드로이드 클라이언트가 있는데 잘 작동합니다. 그러나 어떤 시점에서 서버는 거의 동시에 2 개의 메시지를 전송합니다 (서버에 2 개의 다른 스레드가 있습니다). 그러나 클라이언트에서는 그럴 때 이미 수신 된 첫 번째 메시지 만 수신합니다. 메시지를 파싱하는 동안 성공했지만 실패했습니다. 누군가가 나를 도울 수 있다면 어떻게이 문제를 해결할 수 있습니까?Android의 비동기 네트워크 스트림
내를 받게되며 코드 :
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();
}
코드 및 자세한 내용은 도움이 될 것입니다. – sandrstar
수신 할 코드가 있으며, 구문 분석 기능을 호출하고 계속 수신합니다. –