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);
	}
}