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