IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Socket : Dialogue entre 2 PC


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Par défaut Socket : Dialogue entre 2 PC
    Bonjour,

    Pour m'entrainer à coder en java j'aimerai réaliser un outil permettant de prendre le contrôle à distance d'une autre machine sur Windows et sur un même réseau. Comme le fait VNC ou logmein par exemple.

    Pour se faire, avant chaque type d’envois de donnée (action clavier, souris, capture d'ecran, ...) j’envoie un message texte indiquant quelle va etre le prochain type de donnée afin de bien la réceptionner.

    Actuellement, sur mon poste Client j'envoie juste le message "Capture" suivie d'un screenshot toute les 4 secondes, et du Coté serveur j'affiche juste le message reçu ansi que le screenshot.
    Le problème est que le 1er message reçu s'affiche bien mais que pour tout les suivant la lettre y viens se glisser au début de mon message, je reçoit alors "yCapture" pour tout les message a partir de la 2ème réception. Si je décide de changer le message envoyé, la même erreur se reproduit, pour tout les message a partir du 2eme la lettre y vient se glisser en début de réception

    Voici mon code :

    coté client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    public class Emission implements Runnable {
     
    	private PrintWriter out;
    	//private String message = null;
    	private Scanner sc = null;
    	Socket socket = null;
     
    	public Emission(Socket socketServer) {
    		this.socket = socketServer;
     
    	}
     
     
    	public void run() {
     
    		  sc = new Scanner(System.in);
     
    		  while(true){
    				try {
    					Thread.sleep(2000);
    					envoyerMsg(socket, "Capture");
    					Thread.sleep(2000);
    					envoyerCapture(socket);
     
     
    				} catch (IOException e1) {
    					e1.printStackTrace();
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
     
    			  }
    	}
     
    	static void envoyerMsg(Socket socketClient, String message) throws IOException
    	{
    		PrintWriter out = new PrintWriter(socketClient.getOutputStream());
            out.println(message);
            out.flush();
            System.out.println("Envoyé "+message);
     
    	}
     
     static void envoyerCapture(Socket socket)  throws IOException {
     
    		Robot robot = null;
    		//Get default screen device
            GraphicsEnvironment gEnv=GraphicsEnvironment.getLocalGraphicsEnvironment();
            GraphicsDevice gDev=gEnv.getDefaultScreenDevice();
     
            //Get screen dimensions
            Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
     
            //Prepare Robot object
            try {
    			robot = new Robot(gDev);
    		} catch (AWTException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
     
     
    		Dimension dimensionEcran = Toolkit.getDefaultToolkit().getScreenSize();
     
    		ObjectOutputStream oos = null; //Used to write an object to the stream
    		oos = new ObjectOutputStream(socket.getOutputStream());
    		//oos.writeObject(new Rectangle(dimensionEcran));
     
    		boolean test = true;
    		while(test){
    			test = false;
                //Capture screen
    			BufferedImage captureEcran = null;
    			captureEcran = robot.createScreenCapture(new Rectangle(dimensionEcran));
    			 //capture d'ecran         dimension de la capture
     
     
                /* I have to wrap BufferedImage with ImageIcon because BufferedImage class
                 * does not implement Serializable interface
                 */
                ImageIcon imageIcon = new ImageIcon(captureEcran);
     
                //Send captured screen to the server
                try {
                    System.out.println("before sending image");
                    oos.writeObject(imageIcon);
                    oos.reset(); //Clear ObjectOutputStream cache
                    System.out.println("New screenshot sent");
                } catch (IOException ex) {
                   ex.printStackTrace();
                }
     
                //wait for 100ms to reduce network traffic
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
            }
    	}
    Coté serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    public class Reception implements Runnable {
     
    	static JFrame maFenetre = new JFrame();
    	static JPanel J_connexion = new JPanel();
    	private BufferedReader inMessage;
    	private String message = null;
    	private static Socket socket = null;
     
    	public Reception(Socket socketcClient){
     
    		this.socket = socketcClient;
    		try {
    			inMessage = new BufferedReader (new InputStreamReader (socketcClient.getInputStream()));
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
     
    	public void run() {
     
    		drawGUI();
     
    		while(true){
    	        try {	
     
    			recevoirMsg(socket);
     
    		    } catch (IOException e) {
     
    				e.printStackTrace();
    			}
    		}
    	}
     
     
    	public static void drawGUI(){
     
    		maFenetre.setSize(550, 400); // Ses dimensions
    		maFenetre.setTitle("Connection distante"); // Son titre 
    		maFenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		maFenetre.setLocationRelativeTo(null); //La Centre
    		maFenetre.setVisible(true); // La rend visible
    		maFenetre.setResizable(true); // Non redimensionnable
     
        }
     
    	static void recevoirMsg(Socket socket) throws IOException{
    		 BufferedReader in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
    		 String message_distant = in.readLine();
    		 System.out.println("Reçu : "+message_distant);
     
    		switch (message_distant) {
    		case "Capture":
    			recevoirCapture(socket);
    			break;
     
    		default:
    			recevoirCapture(socket);
    			break;
    		}
    	 }
     
     
    	static void recevoirCapture(Socket socket)  throws IOException {
     
    		ObjectInputStream cObjectInputStream = null;
    	    JPanel cPanel = null;
    	    boolean continueLoop = true;
     
    	            try {
     
    	                //Read screenshots of the client then draw them
    	                while(continueLoop){
    	                	J_connexion = new JPanel();
    	                	continueLoop = false;
    	                    //Recieve client screenshot and resize it to the current panel size
     
    	                	cObjectInputStream = new ObjectInputStream(socket.getInputStream());
    	                    ImageIcon imageIcon = (ImageIcon) cObjectInputStream.readObject();
    	                    System.out.println("New image recieved");
    	                    //Image image = imageIcon.getImage();
     
    	                    JLabel contenuPanel = new JLabel(imageIcon);
    	            		J_connexion.add(contenuPanel);
     
    	            		maFenetre.add(J_connexion);
    	            		maFenetre.revalidate();
     
    	                    /*image = image.getScaledInstance(cPanel.getWidth(),cPanel.getHeight(),Image.SCALE_FAST);
    	                    //Draw the recieved screenshot
    	                    Graphics graphics = cPanel.getGraphics();
    	                    graphics.drawImage(image, 0, 0, cPanel.getWidth(),cPanel.getHeight(),cPanel);*/
    	                }
    	            } catch (IOException ex) {
    	                ex.printStackTrace();
    	          } catch(ClassNotFoundException ex){
    	              ex.printStackTrace();
    	          }
     
     
    	}
    Le plus surprenant est que si du coté client et serveur je supprime la réception et l'envoie du "screenshot" je reçoit le bon message "Capture" et non "yCapture" alors que les 2 fonctions sont indépendante

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    A mon avis c'est un problème de "fin d'élément". Dans ce que tu fais, je trouve ça assez illogique de "mélanger des patates et des carottes" dans ta stream.
    Je te conseillerais d'essayer de toujours passer des objets (ta String est un objet, tu peux la passer en temps que telle).

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Par défaut
    Merci pour ta réponse,
    j'ai transformé l envoie de mon string en envoie d'objet mais je suis confronté a une autre erreur, le 1er message est bien reçu mais les suivants génère cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    java.io.StreamCorruptedException: invalid stream header: 79ACED00
    	at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    	at java.io.ObjectInputStream.<init>(Unknown Source)
    	at Connection.Reception.recevoirMsg(Reception.java:67)
    	at Connection.Reception.run(Reception.java:42)
    	at java.lang.Thread.run(Unknown Source)
    Voici la fonction que j'ai changé pour les envoies
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    static void envoyerMsg(Socket socketClient, String message) throws IOException
    	{
    		ObjectOutputStream oos = null; //Used to write an object to the stream
    		oos = new ObjectOutputStream(socketClient.getOutputStream());
    		oos.writeObject("TESTTTTTT");
            oos.reset(); //Clear ObjectOutputStream cache
    Et pour les réceptions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static void recevoirMsg(Socket socket) throws IOException{
     
     
    		ObjectInputStream cObjectInputStream = null;
    		cObjectInputStream = new ObjectInputStream(socket.getInputStream());
    		String msg;
    		try {
    			msg = (String) cObjectInputStream.readObject();
    			System.out.println(msg);
    		} catch (ClassNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}

Discussions similaires

  1. dialogue entre 2 handlers de sockets
    Par sluke dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 24/12/2011, 17h13
  2. dialogue entre frames
    Par funkadelic dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/12/2005, 11h09
  3. Réponses: 72
    Dernier message: 05/12/2005, 10h45
  4. Dialogue entre systemes embarqués sur un réseau.
    Par zodd dans le forum Développement
    Réponses: 1
    Dernier message: 10/11/2005, 09h34
  5. [FLASH MX2004] [AS2] Dialogue entre 2 SWF- tellTarget ???
    Par Geilgestorm dans le forum ActionScript 1 & ActionScript 2
    Réponses: 11
    Dernier message: 24/10/2004, 22h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo