Ich habe den Java-Server, der die RTMP-Pakete empfängt, die von der Client-App gesendet werden. Der Server liest die packet header
mit InputStream
, erkennt, wie groß die packet body
ist, erstellt dann byte array
mit der size
und liest dann die body
von InputStream
in der .
Das Problem ist: der empfangene Satz von Bytes sind geändert - es gibt notwendige Bytes (die in der Quelle existieren) stehen mit zusätzlichen Bytes, die nicht im Quellpaket existieren (ich beobachte den Inhalt des Quellpakets über WireShark und vergleichen Sie sie mit den Bytes, die ich auf dem Server erhalten habe).
Diese zusätzlichen Bytes 0xc6
Bytes sind, die periodisch von der Art und Weise treffen ...
Es sieht wie folgt aus:
Source: ... 75 f1 f5 55 73 .... fc a9 47 14 ... 40 ca d5 75 ... fe 30 a7
Received: ... 75 f1 f5 55 73 c6 .... fc a9 47 14 c6 ... 40 ca d5 75 c6 ... fe 30 a7
...
- bedeutet "eine gewisse Menge von Bytes hier"
Als Ergebnis Ich kann keine notwendigen Daten empfangen, weil es gestreckt ist, es ist größer als es sein muss, als die body size
, die ich von rtmp header
erhalten habe. Und am wichtigsten ist, dass diese modifizierten Daten nicht das sind, was ich empfangen musste!
Meine Fragen sind: Wie kann es behoben werden? Was ist los mit InputStream
? Warum fügt es diese 0xc6
Bytes in das empfangende Array ein?
Ich verstehe, dass ich empfangene Array einfach analysieren und diese zusätzlichen Bytes ausschließen kann, aber das ist schlechte Lösung, da Geschwindigkeit und Leistung erforderlich sind (und in diesem Fall ist es nicht klar, dass es ein zusätzliches Byte oder Byte aus der Quelle ist) der Vergleich von ganzer Arrays) ...InputStream liest zusätzliche Bytes, die in Quelle nicht vorhanden sind
enter code here
public static void getRtmpPacket(InputStream in) throws Exception {
byte[] rtmpHeader = new byte[8];
byte[] rtmpBody;
int bodySize = 0;
//reading rtmp header:
in.read(rtmpHeader);
//reading the body size. This method works fine
bodySize = Server.bigEndianBytesToInt(rtmpHeader, 4, 3);
rtmpBody = new byte[bodySize];
in.read(rtmpBody);
//printing received data:
System.out.println("Packet:");
System.out.println("Body size: " + bodySize);
System.out.print(bytesToString(rtmpHeader) + " ");
System.out.print(bytesToString(rtmpBody));
System.out.println();
}
-Code, bitte. Vorzugsweise reduziert auf [mcve]. – RealSkeptic
'InputStream' macht das nie. Wenn dies der Fall ist, bedeutet dies, dass die Quelle nicht so gut gebunden ist, wie Sie denken. – fge
Dies ist nicht glaubwürdig. Offensichtlich haben Sie Bugs in dem Code, den Sie nicht gepostet haben, wie zum Beispiel 'bytesToString()'. – EJP