Frage

Ich führe 4 Start -up -Befehle aus und erwarte auch, dass er 4 Antworten erhalten kann. Der Server ist bereits implementiert und ein anderer Entwickler, der Android entwickelt, kann diese 4 separaten Antworten empfangen. Ich erhalte jedoch 2 gute Antworten (getrennt) und dann sind die 3. und 4. Antworten als eine Antwort. Ich habe NSLOG von NSData -Ergebnis in CompleteCurrentread platziert und es gibt mir das zusammengeführte Paket "0106000000000B06000000" anstelle von separaten Paketen "010600000000" und "0B06000000". Ich habe auch diese 3. und 4. Befehle getrennt (jeweils nur eine) getestet und alles ist in Ordnung mit dem Server, es sendet sie separat, doch dort wird die Zusammenführung (mit 3. und 4.) stattgefunden, wenn alle vier Befehle in einer Zeile ausgeführt werden . Irgendwelche Ideen?

UPDATE: Ich denke, ich habe auf die Problemwurzeln zurückgeführt. Es gibt einen Anruf, der Paketdaten aus einem Stream in der dyByTesAvailable -Methode liest:

CFIndex result = [self readIntoBuffer:subBuffer maxLength:bytesToRead];

Und in ReadIntObuffer: MaxLength gibt es einen Anruf (Länge == 256):

return CFReadStreamRead(theReadStream, (UInt8 *)buffer, length);

CfreadStreamRead gibt also eine falsche Paketlänge zurück - es gibt eine Länge von 12 (anstelle von 6) zurück und greift auch zusammengeführte Daten. HM, was könnte dazu führen, dass Cfreadstreamread zwei Pakete in einem einlesen, anstatt sie separat zu lesen ...

UPDATE2: Ich verwende Onsocket: didreaddata: Withtag: Delegate -Methode und erwarte, Antwortdaten mit dem von mir durchgeführten Anforderungs -Tag zu empfangen. Ich habe kürzlich erkannt, Streams sind Streams, keine Pakete, aber wie kann ich das lösen? Die Serverantworten haben keine Beendigung von Zeichen zu Beginn und am Ende der Antwort, nur die Antwortgröße, die als 2 bis 5 Bytes gelten. Ich kann den ersten Teil der Antwort (erstes Paket) schneiden und den zweiten Teil ignorieren, aber wie asyncsocket wird mit dem zweiten Teil der Antwort (zweites Paket) einen weiteren Rückruf tätigen? Wenn ich nur die ersten Teile schneiden und das zweite ignoriere, dann geht das zweite "Paket" verloren ...

Wie kann ich den ersten Teil der Antwort abschneiden und Asyncsocket sagen, dass er einen weiteren Rückruf mit Tag und den zweiten Teil der Antwort als separate Rückruf tätigen soll?

UPDATE3: In ONSOCKET: didreaddata: Withtag :, Ich habe die fusionierte Reaktion manuell abgeschlossen, das erste Teil (erstes Paket) und am Ende einen Anruf nach Onsocket: didreaddata: WithTag: Nochmals:

if (isMergedPacket) {
  ...
 [self onSocket:sock didReadData:restPartOfTheResponse withTag:myCommandTag];
}

Es sieht jedoch so aus, als würde AsyncSocket selbst jedes Anforderungspaket mit seinem Antwortpaket (über AsyncreadPacket -Klasse) mit Tags kombinieren. Mein manuelles Schneiden funktioniert also, aber Asyncsocket weiß nicht, dass ich bereits beide Pakete behandelt habe, und es versucht immer noch, das zweite Paket zu lesen. Also bekomme ich Sock: SollttimeOutreadWithTag: ... Rückruf, der aufgerufen wird, wenn eine Lesevorrichtung ihre Auszeit erreicht hat, ohne abzuschließen.

War es hilfreich?

Lösung

Lösung gefunden. Es ist nicht notwendig, sich in asyncsocket zu ändern und zu graben. Sie müssen nur die Länge jeder Antwort definieren - wie viel Bytes möchten Sie daran interessiert, Ihren Rückruf zu lesen und zu erhalten. Weitere Informationen, die Sie in einem anderen Beitrag können hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top