Ho un ServerSocket e un Socket impostato in modo che ServerSocket invii un flusso di immagini utilizzando ImageIO.write (....) e il socket tenta di leggerli e aggiornare un JFrame con loro. Quindi mi sono chiesto se ImageIO potesse rilevare la fine di un'immagine. (Non ho assolutamente alcuna conoscenza del formato JPEG, quindi l'ho provato invece)Invia un flusso di immagini usando ImageIO?
Apparentemente no.
Sul lato server, ho inviato le immagini in modo continuo utilizzando ImageIO.write (...) in loop con un po 'di sonno in mezzo. Sul lato client, ImageIO leggeva la prima immagine senza problemi, ma sulla successiva restituiva null. Questo è confusionario. Mi aspettavo che bloccasse la lettura della prima immagine (perché pensa che l'immagine successiva faccia ancora parte della stessa immagine), o riesca a leggerla tutte (perché funziona). Cosa sta succedendo? Sembra che ImageIO rilevi la fine della prima immagine, ma non la seconda. (Le immagini, a proposito, sono simili l'una all'altra) C'è un modo semplice per eseguire lo streaming di immagini come questa o devo creare il mio meccanismo che legge i byte in un buffer finché non raggiunge un determinato byte o una sequenza di byte, a che punto legge l'immagine fuori dal buffer?
Questa è la parte utile del mio codice server:
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");
}
E il mio codice cliente:
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
}
Ancora più strano: ho impostato il formato per ImageIO.write su png, e ha funzionato (beh, in una certa misura: metà delle immagini ricevute erano nulle) – DankMemes
Sembra che dovrò implementare il sistema di buffering dopo tutto. :( – DankMemes
* "un flusso di immagini utilizzando ImageIO.write (....) e il socket tenta di leggerle e aggiornare un JFrame con loro." * Se questo è per la chat Web o condivisione dello schermo o simili, nota che richiede flussi video o immagini intelligentemente ridotte al minimo (ad es. un ritaglio solo dell'area modificata, per uno screen cast). L'invio di singole immagini farà sprintare il video risultante come un ghiacciaio (ignorando i cambiamenti climatici globali). –