Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102

    Trasferimento screenshot tramite client-server

    Salve! La mia intenzione era quella di trasferire uno screenshot da un applicazione client ad una applicazione server. Ho fatto varie prove, ma nulla da fare. Questi sono i risultati:

    - Tramite un oggetto ObjectInputStreamer/ObjectOutputStreamer riesco a trasferire gli oggetti che voglio tramite socket, tranne le immagini;
    - Ho cercato il perché, e ho visto che gli oggetti trasferiti su uno stream devono essere serializzati.
    - Allora ho convertito la BufferedImage che mi da la classe Robot (quella per gli screenshots) in una ImageIcon, ma quando tento di trasferire l'ImageIcon mi da il seguente errore al runtime:

    codice:
    java.lang.SecurityException: SHA MessageDigest not available [...]
    Ho cercato un po' in rete ma non sono riuscito a capire come risolverlo...
    - Ho infine cercato di come trasferire delle immagini non serializzate, e ho trovato la classe javax.IOImage che faceva al caso mio! Eseguo tutto correttamente (almeno) ma niente, al runtime mi da nel server errore NullPointerException!

    Nel mentre posto i codici del client/server configurati con la classe IOImage, ma se sapete altre soluzioni vi prego di dirmi come fare, sto un po' esaurendo, mi sento come se tentassi di arrampicarmi sugli specchi!



    codice:
    // Codice applicazione client! Invia lo screenshot al server!
    
    import java.net.*;
    import java.io.*;
    import javax.swing.JOptionPane;
    import java.awt.Toolkit;
    import java.awt.Robot;
    import java.awt.Rectangle;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import javax.imageio.*;
    import javax.swing.ImageIcon;
    
    class Provone {
    	public static void main (String args[]){
    		Socket socket = null;
    		Robot robot = null;
    		//ImageIcon icon = null;
    		BufferedImage image = null;
    		ObjectOutputStream out = null;
    		String ip = JOptionPane.showInputDialog("Please enter server IP");
    		String port = JOptionPane.showInputDialog("Please enter server port");
    		int porta = Integer.parseInt(port);
    		try {
    			robot = new Robot();
    			socket = new Socket(ip, porta);
    		}
    		catch (Exception e){
    			System.out.println("Fanculo!");
    		}
    		try {
    			out = new ObjectOutputStream(socket.getOutputStream());
                            // screenshot dello schermo
    			image = robot.createScreenCapture(new Rectangle(1440,900)); 
    			//trasferimento dello screenshot;
    			ImageIO.write(image, "", out);
    			out.flush();
    			System.out.println("dopo fatidica!");
    		}
    		catch (IOException e){
    			System.out.println("Errore di I/O!");
    		}
    			
    	}
    }
    codice:
    // codice dell'app server, che riceve e disegna lo screenshot
    import java.net.*;
    import java.io.*;
    import javax.swing.*;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.awt.Graphics;
    import javax.imageio.*;
    
    class Provone2{
    	public static void main (String args[]){
    		Socket socket = null;
    		ServerSocket sSocket = null;
    		BufferedImage image = null;
    		ObjectInputStream in = null;
    		JFrame f = new JFrame ();
    		JPanel p = new JPanel ();
    		String port = JOptionPane.showInputDialog("Please enter server port");
    		int porta = Integer.parseInt(port);
    		try {
    			sSocket = new ServerSocket(porta);
    		}
    		catch (Exception e){
    			System.out.println("porta a Fanculo!");
    		}
    		try {
    			while (true){
    				System.out.println("attesa...");
    				socket = sSocket.accept();
    				System.out.println("partito");
    				in = new ObjectInputStream(socket.getInputStream());
    				image = ImageIO.read(in);
    				Graphics g = p.getGraphics();
    				g.drawImage(image, 0, 0, null); // qui mi rileva il NUllPointException, probabilmente il metodo read() non va a buon fine...
    				System.out.println("punto 3");
    				in.close();
    				break;
    			}
    		}
    		catch (IOException e){
    			System.out.println("Problema!");
    		}	
    		f.setLayout(null);
    		f.getContentPane().add(p);
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		p.setBounds(0, 0, 500, 500);
    		f.setResizable(true);
    		f.setVisible(true);
    	}
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    L'errore del tuo primo tentativo non sembrerebbe legato alla serializzazione, ma non possiamo dire molto visto che manca completamente sia il codice che genera quell'errore sia lo stackTrace completo dell'errore.

    Per la seconda soluzione adottata, non credo che il server riesca a costruire l'apposito ImageInputStream; di conseguenza restituisce un'immagine nulla (del resto, non hai specificato al write il formato immagine).

    Tornando alla prima soluzione... il codice dovrebbe essere piuttosto banale, magari prova a postarlo che vediamo di capire cosa sbagliavi.

    Questo è un banale esempio per il client:

    codice:
    // Ottengo lo screenshot
    Robot robot = new Robot();
    BufferedImage image = robot.createScreenCapture( new Rectangle(1440,900) );
    
    // Lo invio tramite socket:
    ObjectOutputStream out = new ObjectOutputStream( socket.getOutputStream() );
    out.writeObject( new ImageIcon(image) );
    out.flush();
    
    // Se devo chiudere la socket
    out.close();
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102
    LeleFT, niente da fare, mi da l'errore della SecurityException!

    Io ti riposto tutto il codice del client con relativo errore, così per farti capire meglio!

    codice:
    import java.net.*;
    import java.io.*;
    import javax.swing.JOptionPane;
    import java.awt.Toolkit;
    import java.awt.Robot;
    import java.awt.Rectangle;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import javax.imageio.*;
    import javax.swing.ImageIcon;
    
    class Provone {
    	public static void main (String args[]){
    		Socket socket = null;
    		Robot robot = null;
    		BufferedImage image = null;
    		ObjectOutputStream out = null;
    		String ip = JOptionPane.showInputDialog("Please enter server IP");
    		String port = JOptionPane.showInputDialog("Please enter server port");
    		int porta = Integer.parseInt(port);
    		try {
    			robot = new Robot();
    			socket = new Socket(ip, porta);
    		}
    		catch (Exception e){
    			System.out.println("Errore!");
    		}
    		try {
    			out = new ObjectOutputStream(socket.getOutputStream());
    			image = robot.createScreenCapture(new Rectangle(1440,900));
    			out.writeObject(new ImageIcon (image));
    			out.flush();
    		}
    		catch (Exception e){
    			System.out.println("Errore!");
    			e.printStackTrace();
    		}
    			
    	}
    }
    
    /*
    
    java.lang.SecurityException: SHA MessageDigest not available
            at java.io.ObjectStreamClass.computeDefaultSUID(ObjectStreamClass.java:1792)
            at java.io.ObjectStreamClass.access$100(ObjectStreamClass.java:69)
            at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:247)
            at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:245)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.io.ObjectStreamClass.getSerialVersionUID(ObjectStreamClass.java:244)
            at java.io.ObjectStreamClass.writeNonProxy(ObjectStreamClass.java:709)
            at java.io.ObjectOutputStream.writeClassDescriptor(ObjectOutputStream.java:664)
            at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1269)
            at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1227)
            at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1411)
            at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
    
            at Provone.main(Provone.java:35)
    
    F:\Terminali video>
    
    */

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Lungi da me interrompere il tuo tentativo di serializzazione dell'oggeto, ma sai che un qualunque file puoi leggerlo e poi inviarlo come sequenza di byte vero?
    Prendo il primo risultato che mi esce con google: http://www.rgagnon.com/javadetails/java-0542.html

    Se stiamo parlando di un semplice filetransfer a me sembrerebbe più normale fare così che non con la serializzazione dell'oggetto.

    P.S. Non mi è chiarissimo se tu sul server e sul client vuoi avere anche lo screenshot salvato su filesystem oppure se vuoi fare tutto in memoria, nel qual caso con la serializzazione forse fai prima.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102
    Originariamente inviato da c0der
    Lungi da me interrompere il tuo tentativo di serializzazione dell'oggeto, ma sai che un qualunque file puoi leggerlo e poi inviarlo come sequenza di byte vero?
    Prendo il primo risultato che mi esce con google: http://www.rgagnon.com/javadetails/java-0542.html

    Se stiamo parlando di un semplice filetransfer a me sembrerebbe più normale fare così che non con la serializzazione dell'oggetto.
    Grazie avevo già visto! Ma il problema è che devo passare lo screenshot senza salvarlo come file in nessun posto, e non penso che una BufferedImage posso spezzettarla in sequenza di byte! Inoltre ne devo catturare e inviare un bel po' e di continuo, cioè uno streaming degli screenshot (l'obiettivo quindi è di duplicare via remota il video del pc client sul pc server!)

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Ok, mi hai riposto mentre scrivevo il messaggio.

    Riguardo all'errore per effettuare la serializzazione servirà un hash SHA (http://it.wikipedia.org/wiki/Secure_Hash_Algorithm) che per qualche motivo non riesce a fare. Posso provare a googlare.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Quale versione di jdk/jre usi?
    Esegui il programma da riga di comando o da un ide?
    Sistema operativo già che ci sei?

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    102
    Originariamente inviato da c0der
    Quale versione di jdk/jre usi?
    Esegui il programma da riga di comando o da un ide?
    Sistema operativo già che ci sei?
    Uso la java 7u4 a 64 bit nel pc server (con win 7 64 bit) e java 7u7 32 bit nel pc client (con win xp service pack 3 32 bit)
    tutti e due i programmi sono lanciati da riga di comando

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Mhm, non si trova molto in effetti.

    Fossi io, non so se per te è troppo una perdita di tempo, proverei a vedere se
    questo SHA non ti funziona a prescindere o se il problema è legato alla serializzazione.

    Proverei un programmino come quello di seguito oppure metterei quello che c'è
    in questa main nella tua attuale main e commenterei il resto.

    codice:
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    class Test{
        public static void main (String[] args) {
            try {
                MessageDigest.getInstance("SHA-1");
            }  catch (NoSuchAlgorithmException ex) {
                ex.printStackTrace();
            }
        }
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Per curiosità ho provato il tuo programma e non ho avuto problemi sul client (ha stampato "dopo fatidica!" ed è uscito correttamente).
    Sul server ho avuto la NullPointerException che avevi segnalato.

    Ho eseguito client e server sullo stesso pc, mettendo come indirizzo del server 127.0.0.1.

    Non avevo visto che c'era anche una seconda versione del Client.
    Con questa versione mi viene stampato:
    Errore!
    java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    subito dopo la NullPointerException sul server, comunque nessun errore relativo a SHA.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.