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 :

[Debutant] Echange données entre pc distants


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut [Debutant] Echange données entre pc distants
    Bonjour,
    tout ce qui est programmation reseau je n'y connais rien et pourtant j'ai besoin d'un code simple (ou meme juste une indication) qui me permettrai d'envoyer ou de recevoir vers un autre ordinateur connecté à internet, des données trés simple: coordonnées x,y et deux booléens. J'espere que ca n'est pas trop dure à faire :-|. Merci !

  2. #2
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Pour la transmission de données sur le réseau regarde les paquets java.net et java.io, et plus précisément les classes Socket, ServerSocket, InputStream et OutputStream.

    Si tes coordonnées sont celles de la souris (on dirait d'après ta description), tu peux utiliser la class Robot du paquet java.awt.

  3. #3
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    merci gfx
    x,y sont en fait les coordonnées de la souris mais un peu transformées
    et d'ailleur je les obtiens grace à l'api du jniwrappper qui permet de hooker la souris et me donner les coordonnées n'importe ou à l'ecran et n'importe quel evenement souris !
    edit: est-ce que tu sais quel port de communication est toujours libre pour ce genre de chose ?
    edit2:dans le lien, pour le mode tcp/ip, le coté serveur et le coté client doivent etre deux classes differentes que je peux appeler client et serveur ?
    mais vu que y'a aucun constructeur ni methodes je ne pense pas, ...

  4. #4
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    voilà ca a l'air de marcher, . Je l'ai modifier pour faire un test en donnant ma machine comme client et serveur, mais lorsque je lis l'input a partir du serveur et que j'affiche ce qu'il y a dedans , aprés lorsque je le renvoie: ca n'a plu l'air de marcher alors que j'ai bien repositionné au bon byte
    voilà le code:
    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
    import java.net.*;
    import java.io.*;
     
     
     
    public class transferts {
    	public static void main(String[] args) {
    	try {
        ServerSocket ecoute = new ServerSocket(5432,5);
        Socket service = (Socket)null;
     
        while(true) {
            service = ecoute.accept();
     
            OutputStream os = service.getOutputStream();
            InputStream  is = service.getInputStream();
            is.mark(is.available());
            System.out.println(is.read()+"ok");
            is.reset();
            os.write(is.read());
     
            service.close();
        }
    } catch (Exception e) {
        // traitement d'erreur
    }
    }	
    }
    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
    public class transferts2 {
    	public static void main(String[] args) {
    		try {
        Socket s = new Socket("80.125.223.47",5432);
     
        OutputStream os = s.getOutputStream();
        InputStream  is = s.getInputStream();
     
        os.write((int)'b');   // OutputStream et non pas Writer
        System.out.println(is.read());
     
        s.close();
    } catch(Exception e) {
        // Traitement d'erreur
    }
     
     
    		}}

  5. #5
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Tu ne peux pas lire deux fois les mêmes données dans le cas d'un socket. Les données lues sont retirées du flux définitivement. Il faut donc les stocker dans une variable temporaire si tu veux les réémettre.

  6. #6
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    ok merci, ca marche maintenant.
    Par contre j'ai fait une legere interface graphique ou il y a un bouton connect pour le serveur avec un label qui devrait changer d'etat dés que le client transfert le byte, mais apparement le contenu de la fenetre s'efface et le serveur n'a pas l'air de tenir compte de service.close vu qu'il a l'air toujours d'attendre des données (pourtant il en a recu d'apres la fenetre console) !!
    aidez moi svp
    edit: voici le code qd meme:
    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
    import java.net.*;
    import java.io.*;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
     
    class Winserv extends JFrame implements ActionListener {
    	public Winserv()
    	{setTitle("serveur");
    	setBounds(10,20,300,200);
    	JButton connect = new JButton ("connect");
    	resultat = new JLabel ("reception:"+res);
    	Container contenu = getContentPane();
    	contenu.setLayout(new FlowLayout());
    	contenu.add(connect);
    	contenu.add(resultat);
    	connect.addActionListener(this);
    	}
     
    	public void actionPerformed (ActionEvent ev)
    	{System.out.println("connected");
     
    		try {
        	ServerSocket ecoute = new ServerSocket(5432,5);
        	Socket service = (Socket)null;
     
        	while(true) {
            			service = ecoute.accept();
            			OutputStream os = service.getOutputStream();
            			InputStream  is = service.getInputStream();
            			res = is.read();
            			System.out.println(res);
                        os.write(res);
            			service.close();
        				}
    		} catch (Exception e) {
        // traitement d'erreur
    		}
    	resultat.setText ("reception:"+res);
    	}
    private int res = 0;
    private JLabel resultat;
    }
     
     
    public class transferts {
     
    	public static void main(String[] args) {
    	Winserv fen = new Winserv();
    	fen.setVisible(true);
     
    	}	
    }
    (le client n'a pas changé)
    edit2: en fait quand resultat.setText est dans actionPerformed ca ne fait rien , sinon ca marche !!! c'est quand meme n'importe quoi, en plus le system.println y marche lui ...

  7. #7
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Ton code bloque l'interface graphique, c'est pour cela que la fenêtre s'efface. Le code d'écoute du serveur doit être dans un thread à part et tu pourras ainsi faire le close().

    Renseigne-toi sur l'EDT (Event Dispatch Thread) et tu comprendras pourquoi la fenêtre s'efface.

  8. #8
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    ok merci, j'ai chercher pendant plus d'une heure quelques exemples , mais je n'ai rien trouvé qui puisse m'eclaircir les idées ...Voilà les seules modifications de mon code (ca ne regle toujours pas le probleme ) :
    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
    class Winserv extends JFrame implements ActionListener{
     
    	private int res;
    	private JLabel resultat;
    	private Container contenu;
    	private JButton connect;
    	private Winserv fen;
     
    	public Winserv()
    	{setTitle("serveur");
    	setBounds(10,20,300,200);
    	connect = new JButton ("connect");
    	res = 0;
    	resultat = new JLabel ("reception:"+res);
    	contenu = getContentPane();
    	contenu.setLayout(new FlowLayout());
    	contenu.add(connect);
    	contenu.add(resultat);
    	connect.addActionListener(this);
    	}
     
    	public void actionPerformed (ActionEvent ev)
    	{	Runnable updateAComponent = new Runnable() {
        	public void run() {
     
    		try {
        	ServerSocket ecoute = new ServerSocket(5432,5);
        	Socket service = (Socket)null;
     
        	while(true) {
            			service = ecoute.accept();
            			OutputStream os = service.getOutputStream();
            			InputStream  is = service.getInputStream();
            			res = is.read();
            			System.out.println(res);
                        os.write(res);
            			service.close();
        				}
    		} catch (Exception e) {
        // traitement d'erreur
    		  };	
    		}};
    		SwingUtilities.invokeLater(updateAComponent);
    	}
     
     
     
    	public static void main(String[] args) {
     
    	Winserv fen = new Winserv();
    	fen.setVisible(true);
     
    	}	
     
    }
    (pourtant tu m'as bien aiguillé , c'est juste que je ne sais pas comment ca fonctionne )

  9. #9
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Remplace :
    SwingUtilities.invokeLater(updateAComponent);

    par :
    Thread t = new Thread(updateAComponent);
    t.start();

    Tu vas avoir d'autres problèmes cela dit avec ça En gros, Swing a son propre thread, appelé l'EDT, et si tu bloques l'EDT (avec ton while (true) et tes socket.XXX) tu empêches l'interface de fonctionner. Tu dois donc lancer un autre thread. Si depuis ce nouveau thread tu veux mettre à jour l'interface, tu dois le faire dans l'EDT. Et SwingUtilities.invokeLater() permet de réinjecter du code dans l'EDT.

  10. #10
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    arg désolé Gfx j'ai parlé un peu trop top (quoique=> 2h20 du mat' ici )
    J'ai trouvéce qu'il fallait ici:
    http://java.sun.com/products/jfc/tsc/articles/threads/src/SwingWorker.java
    ca simplifie la tache
    en tout cas ca marche bien !
    Par contre je ne sais pas si ta solution est equivalente à celle du lien .
    En continuant je vais bien voir si y'a d'autres problemes mais ca a l'air de fonctionner a merveille
    ps: je me suis eloigné du sujet mais d'un coté je ne vais quand meme pas relancer un autre thread sur le forum ?
    En tout cas merci beaucoup pour ton aide !

  11. #11
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    pour continuer sur le sujet, je me demandais si il y avait moyen d'envoyer des objets plus evolués que des entiers : par exemple envoyer un objet de type Point ?
    edit: avec printwriter ?

  12. #12
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    SwingWorker ne fait que masquer les threads et l'EDT. Je te conseille d'apprendre d'abord à utiliser threads + EDT mais SwingWorker est en effet plus agréable

  13. #13
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    me doutait que swingworker c'etait pour les filous mais bon ca m'arrange pour le moment .
    Avec printwriter c'est bien pour envoyer des objets java,et ca marche.
    Sinon je me demandais s'il y avait moyen de mettre au sein de la meme interface graphique: le serveur=class winserv et le client=class wincli ?

  14. #14
    Membre expérimenté

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Par défaut
    Si tu veux envoyer des objets il faut utiliser les ObjectOutputStream et ObjectInputStream, mais il faut que tes objets implémentent l'interface Serializable. Sinon tu as aussi XMLEncoder et XMLDecoder, mais ces flux sont plus bavard, donc ca dépendra des performances de ton réseau...

  15. #15
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    merci mais euh hmm je comprends pas, ...J'ai trouvé une methode du printwitter qui permet d'envoyer des objets , pkoi je ne pourrai pas utiliser ca ?

  16. #16
    Membre expérimenté

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Par défaut
    Le PrintWriter va faire appel à la methode toString() de ton objet.
    Si cette méthode à été redéfini dans l'objet que tu envoies, il est possible que le résultat soit lisible. Mais ce que tu obtiens c'est souvent une représentation de l'emplacement mémoire de ton objet.....
    Si tu veux pouvoir réutiliser l'objet sur ton deuxieme ordinateur, il te faut un flux spécifique.
    Pour le choix des flux, je te conseille de consulter cette page :
    http://java.sun.com/docs/books/tutorial/essential/io/overview.html

  17. #17
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    merci , pas mal mais trop court et un peu compliqué pour moi .
    Un truc: si j'ai bien compris , l'autre methode c'est de decouper byte par byte les infos à envoyer, mais comment l'info est reconstituée alors ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transmission de données entre hotes distants
    Par stalacta dans le forum Réseau/Web
    Réponses: 2
    Dernier message: 30/12/2013, 11h41
  2. echange données entre iphone et SGBD
    Par altair8080 dans le forum Développement iOS
    Réponses: 0
    Dernier message: 01/08/2011, 18h28
  3. Réponses: 16
    Dernier message: 29/06/2005, 20h55
  4. Telechargement d'internet et echange de données entre 2 pc
    Par Invité dans le forum Développement
    Réponses: 5
    Dernier message: 09/05/2004, 21h22
  5. [Kylix] Echange de données entre fiches
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 01/07/2003, 11h34

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