Ich sende ein bufferedImage über einen Socket und verwende das Beispiel in Beitrag:
Absender
%Vor%Empfänger
%Vor%Es funktioniert - IF, und nur wenn ich den outputStream des Senders nach dieser Zeile schließe:
%Vor%Gibt es etwas, was ich tun kann, außer den outputStream zu schließen?
Gibt es noch etwas, das ich tun kann, um die Verwendung von ImageIO zu vermeiden? Es scheint ewig zu dauern, etwas zu tun. Beachten Sie außerdem, dass das Lesen oder Schreiben auf die Festplatte in jedem Fall aufgrund von Leistungsproblemen unbedingt vermieden werden sollte. Ich muss diese Übertragung so schnell wie möglich machen (ich experimentiere und versuche, einen Client zu erstellen, der VNC ähnlich ist und jeden Screenshot auf der Festplatte zu speichern würde alles erheblich verlangsamen).
@ Jon Skeet
Bearbeiten 3:
Absender: (Beachten Sie, dass ich ein JPG-Bild und kein PNG sende).
%Vor% Empfänger: (wobei input
der Socket-Eingabestrom ist)
Versuch # 1:
%Vor%(Fehler: Nullpointer-Ausnahme in der getWidth () -Zeile) Ich verstehe diesen Fehler als "beschädigtes Bild", weil er nicht initialisiert werden konnte. richtig?
Versuch # 2:
%Vor%(Fehler: Nullpointer-Ausnahme in der getWidth () -Zeile)
Versuch # 3:
%Vor%(fehlgeschlagen: Empfänger gibt: Nullzeiger-Ausnahme)
Versuch 4:
%Vor%(fehlgeschlagen: Absender gibt: java.net.SocketException: Verbindung wurde von Peer zurückgesetzt: Socket-Schreibfehler)
Versuch # 5:
Mit Jon Skeets Code-Snippet kommt das Bild an, aber nur teilweise. Ich habe es in eine Datei (1.jpg) gespeichert, um zu sehen, was vor sich geht, und es sendet tatsächlich 80% des Bildes, während der Rest der Datei mit Leerzeichen gefüllt ist. Dies führt zu einem teilweise beschädigten Bild. Hier ist der Code, den ich ausprobiert habe: (beachte, dass captureImg () nicht fehlerhaft ist, das Speichern der Datei funktioniert direkt)
Absender:
%Vor%Empfänger:
%Vor%Der Absender gibt immer noch eine Verbindung zurückgesetzt von Peer: Socket-Schreibfehler. Klicken Sie hier für ein Bild in voller Größe
Eine Option wäre, das Bild in ein ByteArrayOutputStream
zu schreiben, so dass Sie die Länge bestimmen und dann diese Länge zuerst in den Ausgabestrom schreiben können.
Dann können Sie am empfangenden Ende die Länge lesen, dann die vielen Bytes in ein Byte-Array lesen und dann ein ByteArrayInputStream
erstellen, um das Array zu umbrechen und das an ImageIO.read()
weiterzugeben.
Ich bin nicht ganz überrascht, dass es nicht funktioniert, bis der Ausgangs-Socket normal geschlossen wird - schließlich ist eine Datei, die eine gültige PNG-Datei enthält und dann noch etwas , eigentlich kein a gültige PNG-Datei an sich, oder? Der Leser muss also bis zum Ende des Streams lesen, bevor er abgeschlossen werden kann - und das "Ende" eines Netzwerkstroms kommt nur, wenn die Verbindung geschlossen wird.
EDIT: Hier ist eine Methode, um die angegebene Anzahl von Bytes in ein neues Byte-Array zu lesen. Es ist praktisch, als separate "Dienstprogramm" -Methode zu haben.
%Vor%Tags und Links java sockets bufferedimage