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 :

[problème] Les sockets


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé Avatar de knoxville
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Par défaut [problème] Les sockets
    Bonjour à tous !
    A la suite d'un cour plutot evasif, le prof a voulu qu'on developpe une petite messagerie client/server qui utiliserait les sockets.
    Seulement voilà, les sockets j'y comprend absolument rien....

    J'ai donc plusieurs question...On va imaginer que je veux simplement que mon client se connecte à mon server et qu'il reçoit une variable de ce server, puis il affiche, question :
    Comment puis-je faire ceci ?
    Je comprend pas trop comment les fluxs d'entrée et de sortie fonctionnent dans ce cas là ?
    Quel est le rôle d'un buffer ?
    Quel est le rôle du socket ?
    Merci d'avance de vos réponses !

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Prends pour commencer n'importe quel cours sur les sockets.
    En voici un, ici, mais j'imagine qu'il y en a des tas d'autre

  3. #3
    Membre confirmé Avatar de knoxville
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Par défaut
    Bonjour Songoku,
    Effectivement j'ai lu ce cour !
    Mais je ne comprend pas tout car si la partie client est relativement claire, la partie server ne l'est pas car elle fait appel à une api caffeine et moi ce qui m'interesse c'est socketserver. Je veux comprendre les principes de base avant de me faciliter la vie avec ce genre d'astuce.
    Merci tout de meme de ta réponse :p

  4. #4
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour.
    Je te propose alors de consulter le tutoriel de Sun sur les sockets:
    http://java.sun.com/docs/books/tutor...ets/index.html

    Bonne chance.

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    La plupart des systèmes d'exploitations propose une abstraction pour manipuler des données réseaux que l'on nomme socket. Du point vue bas-niveau, un socket se comporte de la même manière qu'un fichier (que l'on manipule généralement via à ce que l'on appelle un file descriptor). Une fois une connexion établie, la gestion des sockets est similaire à la gestion des fichiers.

    En java a été introduit une classe Socket qui permet de manipuler à plus haut-niveau cette abstraction du système d'exploitation. Il existe deux méthodes : getOutputStream() et getInputStream() qui va vous permettre de manipuler les données comme pour un fichier.

    Java fait la différence entre socket côté client (objet qui permet de se connecter à des ordinateurs distants) et socket côté serveur (objet qui permet d'attendre des demandes de connexions de l'extérieur). La classe Socket correspond à un socket client et la classe ServerSocket correspond à un socket serveur.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		Socket s = new Socket("www.developpez.com", 80);
     
    		//ou
    		InetAddress address = InetAddress.getByName("www.developpez.com");
    		Socket s2 = new Socket(address, 80);

    Le code précédent permet de se connecter à un serveur nommé par son IP ou par son nom d'hôte sur un port particulier (ici le port 80). La notion de port, qui est purement virtuelle, a été définie au niveau de la couche TCP et UDP pour permettre de ne pas mélanger les données envoyés à une personne. Par exemple sur un chat, si vous souhaitez parler à quelqu'un et envoyer des fichiers à cette même personne en même temps, il est nécessaire de séparer les données. Ceci étant fait en utilisant deux ports différents pour les deux traitements.

    Il est également possible de réutiliser la classe InetAddress.

    Nous allons à présent envoyer des donner en utilisant un OutputStream.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Socket s = new Socket("www.developpez.com", 80);
     
    		String g = "GET / HTTP/1.1\n" +
    					"Host: www.developpez.com\n\n";
     
    		OutputStream oStream = s.getOutputStream();
    		oStream.write(g.getBytes());
    La chaine g utilise en réalité un protocole de plus haut niveau (protocole HTTP) qui permet de récuperer la page d'index du serveur. Ainsi, on s'attendrait à obtenir la page d'accueil suite à la demande au serveur. Evidemment, à ce moment, nous n'avons pas encore traité les données renvoyés par le serveur, nous utiliserons donc un InputStream.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	InputStream iStream = s.getInputStream();
     
    		byte[] b = new byte[1000]; //définition d'un tableau pour lire les données arrivées
    		int bitsRecus = iStream.read(b); //il n'est pas sûr que l'on recoive 1000 bits
    		if(bitsRecus>0) {
    			System.out.println("On a recu : " + bitsRecus + " bits");
    			System.out.println("Recu : " + new String(b,0, bitsRecus));
    		}
    Normalement, vous devrirez obtenir à ce stade quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    On a recu : 1000 bits
    HTTP/1.1 200 OK
    Date: Wed, 17 Oct 2007 11:57:24 GMT
    Server: Apache/2.2.4 (Unix) PHP/4.4.6
    X-Powered-By: PHP/4.4.6
    Transfer-Encoding: chunked
    Content-Type: text/html
     
    3c82
     
    <html>
    <head>
    ...
    Nous voyons donc une partie de la page html qui commence. C'est un bon début. La méthode read retourne le nombre d'octet lu. Si -1 est renvoyé, c'est que la communication est terminée et que vous avez fini de lire. Hors, nous n'avons pas lu toutes les données, nous pouvons à la place utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	int bitsRecus = 0;
    			while((bitsRecus = iStream.read(b)) >= 0) {
     
    				System.out.println("On a recu : " + bitsRecus + " bits");
    				System.out.println("Recu : " + new String(b, 0, bitsRecus));
    			}
    Lorsque l'on crée et que l'on connecte un socket, on a acquis des ressources donné par le système d'exploitation, il est nécessaire de les rendre au système en utilisant la méthode close, aussi bien sur les flux que sur les sockets. Celà est également utile pour la communication car vous indiquez que vous avez terminer de parler. Un code plus complet pourrait donc être le suivant :

    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
    public static void main(String[] args) throws IOException {
    		Socket s = new Socket("www.developpez.com", 80);
    		//recupération des flux
    		OutputStream oStream = s.getOutputStream();;
    		InputStream iStream = s.getInputStream();;
     
    		byte[] b = new byte[1000];
    		String g = "GET / HTTP/1.1\n" + "Host: www.developpez.com\n\n";
     
    		try {	
     
    			oStream.write(g.getBytes());
     
    			int bitsRecus = 0;
    			while((bitsRecus = iStream.read(b)) >= 0) {
     
    				System.out.println("On a recu : " + bitsRecus + " bits");
    				System.out.println("Recu : " + new String(b, 0, bitsRecus));
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
     
    			//fermeture des flux et des sockets
    			oStream.close();
    			iStream.close();
    			s.close();
    		}
     
    	}
    Si vous remplacez la chaine "Host: www.developpez.com\n\n" par la chaine "Host: www.developpez.com\n" (simple retour à la ligne), vous vous rendrez compte que le programme s'arrête au niveau de l'appel à la méthode read. En effet, par défaut, la lecture est bloquante, tant que l'on a pas reçu de données, le thread courant s'endort et ne se réveille que lorsque le serveur enverra des données.





    Je donnerai le lien du cours complet lorsqu'il sera publié

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Par défaut

    ça c'est de la réponse Bon ça ne fait que rappeler les bases mais c'est parfait pour les débutants, j'aurais aimé trouvé un tutoriel de cette qualité à mes débuts :p

    Félicitation et vivement le cours millie

  7. #7
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Juste pour indiquer que le cours dont je parlais est maintenant disponible ici : http://humbert-florent.developpez.co...reseau/avance/

  8. #8
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    Voici le lien avec lequel j'ai compris ce qu'était un serveur, un client, les sockets en java : http://defaut.developpez.com/tutorie...r/multithread/

    Bon courage

Discussions similaires

  1. Problème avec les sockets
    Par projeticq dans le forum Réseau
    Réponses: 14
    Dernier message: 19/04/2007, 09h32
  2. Problème avec les sockets et la fonction accept
    Par projeticq dans le forum Réseau
    Réponses: 6
    Dernier message: 13/04/2007, 11h37
  3. Problème pour retrouver les Sockets
    Par Bouguennec dans le forum Delphi
    Réponses: 1
    Dernier message: 10/11/2006, 12h47
  4. Problème d'envoie de text avec les sockets
    Par Coussati dans le forum Web & réseau
    Réponses: 6
    Dernier message: 16/09/2005, 10h26
  5. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15

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