Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Lentezza Socket

  1. #1

    Lentezza Socket

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

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    quanto è grande l'immagine?
    ti chiederei quanto impieghi per il download di un qualsiasi file della stessa dimensione da remoto.
    RTFM Read That F*** Manual!!!

  3. #3
    Sono screenshot 1024x768 = 786432 che moltiplicato x 3 byte (rgb) fa 2.3 megabytes. Il tempo sarebbe impiegato soprattutto dal client che me lo manda.

    Come posso comprimere una BufferedImage?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    puoi vedere di raggiungere qualche risultato non serializzando l'oggetto, ma inviando direttamente l'immagine come sequenza di byte.
    A questo proposito da un'occhiata qui e qui e una ricerca in rete ti da altri result
    RTFM Read That F*** Manual!!!

  5. #5
    Ti ringrazio di tutto. Gentilissimo

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.