Domanda

Sto eseguendo 4 comandi di avvio e mi aspetto anche di ricevere 4 risposte. Il server è già implementato e un altro Dev che sta sviluppando Android, è in grado di ricevere quelle 4 risposte separate, tuttavia sto ottenendo 2 buone risposte (separate) e quindi la terza e la 4a risposta arrivano come una risposta. I'V collocato nslog di nsdata risultato in completecurrentread e mi produce pacchetto unita "0106000000000b0600000000" invece di pacchetti separati "010600000000" e "0B0600000000". Avrò anche testato quei comandi di 3 ° e 4 ° separatamente (solo uno alla volta) e tutto va bene con il server, li invia separatamente, tuttavia si verificano unione (con 3 ° e 4 °) se tutti e quattro i comandi vengono eseguiti in una riga . Qualche idea?

AGGIORNAMENTO: Penso che sia trapelato alle radici del problema. C'è una chiamata che legge i dati dei pacchetti da un flusso nel metodo DobyteSavailable:

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

E in ReadInToBuffer: MaxLength, c'è una chiamata (lunghezza == 256):

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

Pertanto, CFreadStreamRead restituisce una lunghezza errata del pacchetto: restituisce una lunghezza di 12 (anziché 6) e acquisisce anche dati uniti. Hm, cosa potrebbe causare in uno in uno in uno, invece di leggerli separatamente ...

Update2: Sto usando OnSocket: DidReadData: Withtag: Delegate Metodo e mi aspetto di ricevere dati di risposta con il tag di richiesta che ho eseguito. Ho realizzato di recente, i flussi sono flussi, non pacchetti ma come posso risolverlo? Le risposte del server non hanno terminato i caratteri all'inizio e alla fine della risposta, solo dimensioni della risposta, che arrivano come 2-5 byte. Posso tagliare la prima parte della risposta (primo pacchetto) e ignorare la seconda parte, ma il modo in cui AsyncSocket farà un altro callback con la seconda parte della risposta (secondo pacchetto)? Se taglierò solo le prime parti e ignorerò la seconda, allora immo il secondo "pacchetto" andrà perso ...

Come tagliare la prima parte della risposta e dire a AsyncSocket di fare un altro callback con TAG e la seconda parte della risposta come callback separato?

Update3: in OnSocket: didReadData: Withtag :, ho tagliato manualmente la risposta unica, gestisco la prima parte (primo pacchetto) e poi alla fine, lanciando una chiamata a OnSocket: DidReadData: Withtag: Again: Again: di nuovo: con

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

Tuttavia, sembra che AsyncSocket stesso abbina ogni pacchetto di richieste con il suo pacchetto di risposta (tramite la classe AsynCreadPacket) usando i tag. Quindi, il mio taglio manuale funziona, ma AsyncSocket non sa che ho già gestito entrambi i pacchetti e cerca ancora di leggere il secondo pacchetto. Quindi, sto ricevendo calzino: dovrebbe tempouTreadwithtag: ... callback che si chiama quando un'operazione di lettura ha raggiunto il suo timeout senza completare.

È stato utile?

Soluzione

Soluzione trovata. Non è necessario cambiare e scavare in asincocchetti. Devi solo definire la lunghezza di ogni risposta: quanti byte sei interessato a leggere e ottenere il callback. Maggiori informazioni che puoi su altri post qui

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top