Ho creato 2 classi: una che dovrebbe fungere da SERVER ed un'altra da CLIENT.
Il funzionamento è che il Client fa uno ScreenShot (come se si premesse Stamp) e lo invia su socket, il Server lo riceve e lo visualizza in un frame. Facendo delle prove ho visto che il trasferimento dell'ImageIcon su socket impiega tempi differenti:

- Provandola in locale è tutto istantaneo (usando come ip "localhost")
- Provando usando l'ip della mia macchina impiega tra i 4 e i 6 secondi
- Facendo eseguire il client su un'altra macchina non nella stessa rete impiega all'incirca 3 minuti!

Come ben capirete 3 minuti sono troppi. Come posso fare per velocizzare il terzo caso?
Ovviamente:
* la porta è aperta altrimenti il trasferimento nel secondo e nel terzo caso non sarebbe mai avvenuto
* mi sono assicurato che nessuno dei 2 pc stesse in download/upload

Vi posto le mie 2 classi:

Server:
codice:
import java.net.*;
import java.io.*;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Marco {
	static Logger logger = Logger.getLogger("global");
	
	public static void main(String[] args)
	{
		try
		{
			
			ServerSocket serverSocket = new ServerSocket(9000);
			logger.info("Socket istanziato, accetto connessioni...");
			JFrame gamepanel = new JFrame();
			JLabel dice1 = new JLabel();
			dice1.setSize(1024, 768);
			gamepanel.setVisible(true);
			
			while(true)
			{
				Socket socket = serverSocket.accept();
				logger.info("Accettata una connessione... attendo comandi");
				ObjectInputStream inStream = new ObjectInputStream (socket.getInputStream());
				ObjectOutputStream outStream = new ObjectOutputStream (socket.getOutputStream());
				
				
				ImageIcon img = (ImageIcon) inStream.readObject();
				
				
				dice1.setIcon(img);
				gamepanel.add(dice1);
				gamepanel.repaint();
				outStream.writeObject("STOP");
				
			}
		}
		catch(EOFException e)
		{
			logger.severe("Problemi con la connessione: "+e.getMessage());
			e.printStackTrace();
		}
		catch(Throwable t)
		{
			logger.severe("Lanciata Throwable: "+t.getMessage());
			t.printStackTrace();
		}
	}
}

Client:
codice:
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.Socket;

import javax.swing.ImageIcon;

class Client
{
  public static void main(String args[]) throws
           AWTException, IOException, InterruptedException {
	  
	while(true){
	  
	  try
		{
		  	BufferedImage screencapture = new Robot().createScreenCapture(
		           new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );
		  	
			Socket socket = new Socket("localhost", 9000);
			ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
			ObjectInputStream inStream = new ObjectInputStream (socket.getInputStream());
		
			ImageIcon imageIcon = new ImageIcon(screencapture);
		
			out.writeObject(imageIcon);
			inStream.readObject();
			out.flush();
			socket.close();
		}
		catch(EOFException e)
		{
			e.printStackTrace();
		}
		catch(Throwable t)
		{
			t.printStackTrace();
		}
  }
	
  }
}