Mam ServerSocket i gniazdo skonfigurowane tak, że ServerSocket wysyła strumień obrazów za pomocą ImageIO.write (....), a Socket próbuje je odczytać i zaktualizować JFrame za ich pomocą. Zastanawiałem się, czy ImageIO może wykryć koniec obrazu. (Nie mam absolutnie żadnej wiedzy o formacie JPEG, więc przetestowałem go zamiast tego)Wysyłaj strumień zdjęć za pomocą ImageIO?
Najwyraźniej nie.
Po stronie serwera wysyłałem obrazy w trybie ciągłym za pomocą ImageIO.write (...) w pętli z niektórymi miejscami do spania. Po stronie klienta ImageIO odczytał pierwszy obraz bez problemu, ale przy następnym zwrócono wartość zerową. To jest mylące. Spodziewałem się, że albo zablokuje czytanie pierwszego obrazu (ponieważ myśli, że następny obraz nadal jest częścią tego samego obrazu), albo odniesie sukces podczas czytania wszystkich (ponieważ działa). Co się dzieje? Wygląda na to, że ImageIO wykrywa koniec pierwszego obrazu, ale nie drugi. (Nawiasem mówiąc, obrazy są do siebie podobne) Czy istnieje prosty sposób przesyłania obrazów w ten sposób lub czy muszę stworzyć własny mechanizm, który odczytuje bajty w buforze, dopóki nie osiągnie określonego bajtu lub sekwencji bajtów, w którym momencie odczytuje obraz z bufora?
Jest to przydatna część mojego kodu serwera:
while(true){
Socket sock=s.accept();
System.out.println("Connection");
OutputStream out=sock.getOutputStream();
while(!socket.isClosed()){
BufferedImage img=//get image
ImageIO.write(img, "jpg", out);
Thread.sleep(100);
}
System.out.println("Closed");
}
A mój kod klienta:
Socket s=new Socket(InetAddress.getByName("localhost"), 1998);
InputStream in=s.getInputStream();
while(!s.isClosed()){
BufferedImage img=ImageIO.read(in);
if(img==null)//this is what happens on the SECOND image
else // do something useful with the image
}
Jeszcze dziwniejsze: ustawiłem format ImageIO.write na png, i zadziałało (no, w pewnym stopniu, połowa otrzymanych obrazów była zerowa) – DankMemes
Wygląda na to, że będę musiał zaimplementować system buforujący. :( – DankMemes
* "strumień obrazów za pomocą ImageIO.write (....) a Gniazdo próbuje je odczytać i zaktualizować JFrame za ich pomocą." * Jeśli jest to przeznaczone do czatu internetowego lub udostępniania ekranu lub podobnego, uwaga że wymaga strumieni wideo lub inteligentnie zminimalizowanych obrazów (np. przycinanie tylko zmienionego obszaru, dla rzutu ekranu) Wysyłanie pojedynczych obrazów spowoduje, że powstały film będzie przebiegał jak lodowiec (ignorując globalną zmianę klimatu). –