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

Rispondi quotando
