2017-01-26 2 views
0

Ich habe einen Server & Client-Modell. Der Client soll einen Screenshot machen und ihn dann an den Server senden. Das Problem, das ich habe, ist ein Teil des Screenshots fehlt. Was ich damit meine, ist wie 3/4 des Bildschirms ist schwarz, wenn in Paint oder einer anderen App geöffnet. Wenn ich den Screenshot-Befehl ein zweites Mal sende, wird die Datei überhaupt nicht geöffnet, sie ist beschädigt.Bild sendet nicht vollständig über TCP

Hier ist meine Client-Seite

if (plainText.Contains("screenshot")) 
    { 
     Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 
     Graphics graphics = Graphics.FromImage(bitmap); 
     graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size); 
     bitmap.Save("test.bmp"); 
     writebuffer = File.ReadAllBytes("test.bmp"); 
     stream.Write(writebuffer, 0, writebuffer.Length); 
    } 

Wie Sie sehen können, ist es einen Screenshot nimmt, speichert das Bild in eine Bitmap-Datei, liest dann die Bytes in einen Puffer und sendet sie.

Hier ist meine Server-Seite

foreach (user c in clientList) 
     { 
      if (c.RemoteIPAddress == currentRow) 
      { 
       NetworkStream stream = c.clientTCP.GetStream(); 
       writeBuffer = Encoding.ASCII.GetBytes("screenshot"); 
       stream.Write(writeBuffer, 0, writeBuffer.Length); 

       byte[] readBuffer = new byte[0]; 
       readBuffer = new byte[c.clientTCP.ReceiveBufferSize]; 
       int data = stream.Read(readBuffer, 0, readBuffer.Length); 

       string x = new Random().Next().ToString(); 

       FileStream f = new FileStream(new Random().Next() + ".bmp", FileMode.Create, FileAccess.Write); 
       f.Write(readBuffer, 0, data); 
       f.Close(); 
       Process.Start(x + ".bmp"); 

      } 
     } 

Hier schicke ich den Befehl, den Client zu sagen, um einen Screenshot zu senden, dann den Bildschirm erhalten, und dann die besagte Screenshot in eine Bitmap-Datei zu schreiben.

Ich kann nicht herausfinden, was die oben genannten Probleme in diesem Code verursacht.

+1

Wird das Protokoll, das Sie verwenden, dokumentiert? Wenn ja, wie heißt es, dass der Absender die Größe der Datei angibt? Und wie sagt es der Empfänger bestimmt, wenn es die ganze Datei hat? Wenn das Protokoll nicht dokumentiert ist, * stop * und dokumentieren Sie es, bevor Sie weiteren Code schreiben. Es gibt keine Möglichkeit zu wissen, ob Ihr Code korrekt ist oder ob der Absender oder Empfänger einen Fehler hat, ohne dass ein Protokolldokument definiert, was richtiges Verhalten ausmacht. –

+0

Ich denke, das Problem ist nicht der Mangel an Dokumentation, ich denke, er versteht nicht, warum nicht alle Bytes geschrieben werden. –

Antwort

4

Davids "Antwort" ist nutzlos. "Hurr Muh-Protokoll". Der Grund dafür, dass Ihr Code nicht funktioniert, liegt darin, dass die maximale Größe eines Pakets 65535 beträgt und Sie davon ausgehen, dass das Bild nicht größer ist als das - d. H. Sie lesen nur ein Paket. Verwenden Sie diese Schleife, um alle Pakete zu lesen.

Es wird überprüft, ob Daten im Stream verfügbar sind, und lesen Sie es, bis nichts mehr übrig ist.

0

Ich kann nicht herausfinden, was die oben genannten Probleme in diesem Code verursacht.

Das liegt daran, dass Sie nichts zu vergleichen haben. Es gibt viele korrekte Möglichkeiten, ein Bild zu senden und viele richtige Möglichkeiten, ein Bild zu erhalten. Aber wenn Sie möchten, dass Ihr Code funktioniert, müssen sich Sender und Empfänger darauf einigen, wie ein Bild gesendet wird. Dies wird als "Protokoll" bezeichnet und sollte immer dokumentiert werden.

Wenn Sie ein Dokument für dieses Protokoll haben, würde es angeben, wie der Absender die Größe des Bildes angibt. Und es würde spezifizieren, wie der Empfänger bestimmt, wenn es das gesamte Bild hat. Sie könnten dann überprüfen, ob Sender und Empfänger das tun, was das Protokoll sagt. Wenn sie es tun, dann wäre es das Protokoll, das gebrochen wurde.

Wenn Sie eine Netzwerkverbindung oder -datei verwenden und kein vorhandenes Protokoll oder Format verwenden, Dokument das Protokoll oder Format, das Sie auf Byteebene verwenden möchten. Auf diese Weise können Sie feststellen, ob der Sender oder Empfänger defekt ist, indem Sie sein Verhalten mit dem vom Protokoll angegebenen Verhalten vergleichen.

Ohne ein Protokoll gibt es keine Möglichkeit zu sagen, wer die Schuld trägt, da es keinen Standard des korrekten Verhaltens gibt, mit dem sie verglichen werden können.

Denken Sie niemals, dass Ihr Protokoll zu einfach zu dokumentieren ist. Wenn es so einfach ist, sollte das Dokumentieren einfach sein. Und wenn Sie denken, dass es zu komplex ist, um es zu dokumentieren, dann haben Sie kein Gebet, es korrekt umzusetzen.

Übrigens ist es möglich, ein Protokoll zu haben, für das der Sendecode korrekt ist. Aber es ist sehr schwierig. Es ist unmöglich, ein Protokoll zu haben, für das Ihr Empfangscode korrekt ist, da es buchstäblich keine Möglichkeit gibt zu wissen, ob es die gesamte Datei enthält oder nicht.

+0

Das wäre wahrscheinlich ein guter Anfang. Ich nehme an, ich war ein bisschen weit vor mir. – rrrrrrrrrrrrrrrr

+0

Es wird schmerzhaft dein erstes Mal sein, weil du jeden offensichtlichen Fehler machen musst. Aber es wird es wert sein, weil es beim zweiten Mal viel weniger schmerzhaft sein wird. Und eine Brise danach. Und es ist von unschätzbarem Wert, wenn Sie versuchen, Ihren Code zu warten oder zu debuggen, einen anderen Client oder Server zu implementieren, der interoperiert, und so weiter. –