Canalblog
Suivre ce blog Administration + Créer mon blog

Les Tutoriaux Informatiques - Java

Les Tutoriaux Informatiques - Java
Publicité
Les Tutoriaux Informatiques - Java
Derniers commentaires
17 août 2006

Informations concernant Jain Sip

Je suis en train de développer une application de VoIP utilisant l'API Jain SIP. j'ai déja rencontré de nombreuses difficultés sur ce sujet et je sais qu'il n'y a pas beaucoup de documentation, ou de personnes ayant travaillé sur les mêmes projets. Je reste a votre entière disposition si vous voulez poser des questions. Vous pouvez laisser des commentaires, et si vous voulez en savoir plus, je vous laisserai une adresse email pour que vous puissiez me contacter.

Publicité
Publicité
18 juillet 2006

Serveurs STUN

STUN (Simple Traversal of UDP through NATs) est un protocole client-serveur de l'IETF (RFC 3489) permettant à un client UDP situé derrière un routeur NAT (ou de multiples NAT) de découvrir son adresse IP publique ainsi que le type de routeur NAT derrière lequel il est. Ces informations sont utilisées pour échanger correctement des données UDP avec l'extérieur d'un réseau NATé.

STUN ne résout pas tous les problèmes liés aux routeurs NAT. Il est cependant très intéressant dans le domaine de la voix sur IP et notamment en utilisation avec le protocole SIP. Pour l'utilisation de SIP en Peer-to-Peer, il est indispensable au deux machines distantes de connaitres leurs adresses publiques si elles sont placées derrière un NAT. Si elle ne connaissent pas cette adresse publique, les messages contiendront des adresses privées non routables sur internet, et les clients ne pourront jamais recevoir de données.

Voici maintentant une architecture Réseau permettant d'utiliser un serveur STUN pour faire de la voix sur IP.

STUN2

Cette architecture montre plusieurs machines masquées derrière des réseaux privés. Le but de la manipulation est de pouvoir créér une communication entre le poste 1 du premier réseau, et le poste 1 du deuxième réseau.

Pour ce faire, les deux machines vont envoyer une requete UDP à leur serveur STUN, celui ci renvoyant l'adresse de sortie de ces machines. La machine connaissant ses caractéristiques publiques, elle peut modifier les en - tetes de ses messages SIP afin de faire croire que c'est une machine possédant une adresse publique. Puis, les deux machines s'enregistrent auprès du serveur REGISTRAR. Lorsque les deux machines sont enregistrées avec leurs caractéristiques publiques, elles peuvent engager une conversation en Peer-to-Peer en appelant le serveur proxy chargé de retrouver les machines grace aux URI SIP.

Deuxieme configuration :

Les deux machines veulent communiquer, elles sont toutes les deux derriere un routeur faisant du NAT, mais elles sont placées sur le même réseau.

Le but de la manipulation est maintenant de faire communiquer les deux machines, sans que le transfert de la voix ne sorte du routeur.

STUN

21 juin 2006

Jain SIP

SIP : Session Initiation Protocol

Introduction

SIP est un protocole normalisé et standardisé par l'IETF qui a été conçu pour établir, modifier et terminer des sessions multimédia. Il se charge de l'authentification et la localisation des multiples participants. Il se charge également de la négociation sur les types de média utilisables par les différents utilisateurs. SIP ne transporte pas les données échangées durant la session comme la voix ou la vidéo. SIP étant indépendant de la transmission des données, tout type de données et de protocoles peut être utilisé pour cet échange. Cependant le protocole RTP (Real-time Transport Protocol) assure le plus souvent les sessions audio et vidéo. 

SIP est le standard ouvert de VoIP (Voice Over IP, voix sur IP) interopérable le plus étendu et vise à devenir LE standard des télécommunications multimédia (son, image...). SIP n'est donc pas seulement destiné à la VoIP mais pour de nombreuses autres applications telles que la visiophonie, la messagerie instantanée, la réalité virtuelle ou même les jeux vidéo.

1. Fonctionnement

        SIP partage de nombreuses similitudes avec le protocole HTTP comme le codage en ASCII et les codes de réponse.

Un utilisateur peut se connecter avec les utilisateurs d’une session déjà ouverte. Pour ouvrir une session, un utilisateur émet une invitation transportant un descripteur de session permettant aux utilisateurs souhaitant communiquer de s’accorder sur la compatibilité de leur média, SIP permet donc de relier des stations mobiles en transmettant ou redirigeant les requêtes vers la position courante de la station appelée.

a. Fonctionnalités :

- Localisation du terminal appelé.

- Analyse du profil et des ressources du destinataire.

- Négociation du type de média (voix, vidéo, données…), et des paramètres de

communication.

- Disponibilité de l’appelé : détermine si le poste appelé souhaite communiquer, et

autorise l’appelant à le contacter.

- Etablissement et suivi de l’appel : avertit les parties appelant et appelé de la

demande d’ouverture de session, gestion du transfert et de la fermeture des appels.

b. Architecture

Avec SIP, les utilisateurs qui ouvrent une session peuvent communiquer en mode point à point, en mode diffusif ou dans un mode combinant ceux-ci. SIP permet donc l’ouverture de sessions en mode :

- point-à-point : communication entre 2 machines, on parle d’unicast (a)

->téléphonie sur IP

- diffusif : plusieurs utilisateurs en multicast, via une unité de contrôle M.C.U (Multipoint Control Unit) (b)

->visioconférence

->forum

- combinatoire : plusieurs utilisateurs pleinement interconnectés en multicast via un réseau à maillage complet de connexions (c)

sans_titre5

c. Ouverture d’une session

Les différents éléments intervenant dans l’ouverture d’une session :

- Suivant nature des échanges, choix des protocoles les mieux adaptés (RSVP, RTP, RTCP, SAP, SDP).

- Détermination du nombre de sessions : par exemple, pour véhiculer de la vidéo, 2

sessions doivent être ouvertes (l’une pour l’image et l’autre pour la vidéo).

- Chaque utilisateur et sa machine est identifié par une adresse que l’on nomme

URL SIP et qui se présente comme une URL Mailto :

Informations_utilisateur@domaine paramètres en-têtes

Informations_utilisateur : nom d’utilisateur ou numéro de téléphone

Domaine : nom de domaine (lip6.fr) ou adresse IP : port

Paramètres : transport = udp ou tcp / user = phone ou IP / method = INVITE, ACK, OPTIONS, BYE, CANCEL, REGISTER / ttl = 0 à 255 /maddr = adresse IP de multicast…

En-têtes : hname = hvalue & hname = hvalue…

- Requête URI : permet de localiser le proxy server auquel est rattaché la machine

de l’appelé

- Requête SIP : une fois le client (machine appelante) connecté à un serveur SIP

distant, il peut lui adresser une ou plusieurs requêtes SIP et recevoir une ou

plusieurs réponses de ce serveur. Les réponses contiennent certains champs

identiques à ceux des requêtes, tels que : Call-ID, Cseq, To et From.

d. Description des méthodes de requêtes

Les échanges entre un terminal appelant et un terminal appelé se font par l’intermédiaire de requêtes :

- INVITE : cette requête indique que l’application (ou utilisateur) correspondante à

l’URL SIP spécifié est invité à participer à une session. Le corps du message décrit

cette session (par ex : média supportés par l’appelant ). En cas de réponse

favorable, l’invité doit spécifier les médias qu’il supporte.

- ACK : permet de confirmer que le terminal appelant a bien reçu une réponse

définitive à une requête INVITE.

- OPTIONS : un proxy server en mesure de contacter un terminal appelé, doit

répondre à une requête OPTIONS en précisant ses capacités à contacter le même

terminal.

- BYE : cette requête est utilisée par le terminal de l’appelé à fin de signaler qu’il

souhaite mettre un terme à la session.

- CANCEL : cette requête est envoyée par un terminal ou un proxy server afin

d’annuler une requête non validée par une réponse finale :

ðSi une machine ayant été invitée à participer à une session, et ayant accepté

l’invitation ne reçoit pas de requête ACK, alors elle émet une requête CANCEL.

- REGISTER : cette méthode est utilisée par un client pour enregistrer son adresse

auprès du serveur auquel il est relié.

e. Sécurité et Authentification

Les messages SIP peuvent contenir des données confidentielles, en effet le protocole SIP

possède 3 mécanismes de cryptage :

- Cryptage de bout en bout du Corps du message SIP et de certains champs d’en-tête

sensibles aux attaques.

- Cryptage au saut par saut (hop by hop) à fin d’empêcher des pirates de savoir qui

appelle qui.

- Cryptage au saut par saut du champ d’en-tête Via pour dissimuler la route qu’a

emprunté la requête.

De plus, à fin d’empêcher à tout intrus de modifier et retransmettre des requêtes ou réponses SIP, des mécanismes d’intégrité et d’authentification des messages sont mis en place. Et pour des messages SIP transmis de bout en bout, des clés publiques et signatures sont utilisées par SIP et stockées dans les champs d’en-tête Authorization.

Une autre attaque connue avec TCP ou UDP est le « deny of service », lorsqu’un Proxy Server intrus renvoie une réponse de code 6xx au client (signifiant un échec général, la requête ne peut être traitée). Le client peut ignorer cette réponse. Si il ne l’ignore pas et émet une requête vers le serveur "régulier" auquel il était relié avant la réponse du serveur "intrus", la requête aura de fortes chances d’atteindre le serveur intrus et non son vrai destinataire.

f. Les Users Agents.

Les User Agents désignent les agents que l'on retrouve dans les téléphones SIP, les softphones (logiciels de téléphonie sur IP) des ordinateurs et PDA ou les passerelles SIP. En théorie, on peut établir des sessions directement entre deux User Agents, deux téléphones par exemple. Mais cela nécessite de connaître l'adresse IP du destinataire. Cela n'est pas l'idéal car une adresse IP peut ne pas être publique (derrière un NAT) ou changer et elle est bien plus compliquée à retenir qu'une URI. Les User Agents peuvent donc s'enregistrer auprès de Registrars pour signaler leur emplacement courant, c'est à dire leur adresse IP.

g. Les registrars

Le Registrar est un serveur qui gère les requêtes REGISTER envoyées par les Users Agents pour signaler leur emplacement courant. Ces requêtes contiennent donc une adresse IP, associée à une URI, qui seront stockées dans une base de données. Les URI SIP sont très similaires dans leur forme à des adresses email : SIP:utilisateur@domaine.com Généralement, des mécanismes d'authentification permettent d'éviter que quiconque puisse s'enregistrer avec n'importe quelle URI.

h. Les Proxy

Un Proxy SIP sert d'intermédiaire entre deux User Agents qui ne connaissent pas leurs emplacements respectifs (adresse IP). En effet, l'association URI-Adresse IP a été stockée préalablement dans une base de données par un Registrar. Le Proxy peut donc interroger cette base de données pour diriger les messages vers le destinataire.

Un petit exemple concret pour bien comprendre: vous n'êtes qu'un pauvre internaute connecté temporairement grâce à un modem 56k. Votre machine n'a pas de nom de domaine connu et votre adresse IP change à chaque nouvelle connexion. Il est impossible pour vos amis de vous joindre car ils ne peuvent deviner votre adresse IP, à moins que vous ne leur donniez en envoyant un courriel, par exemple. Pour palier à ce problème, vous pouvez demander à avoir un compte sur un serveur SIP connu de vos amis, qui lui est fixe et tout le temps connecté. Pour cela, spécifiez l'adresse du serveur dans la boite de propriété, section SIP. Cette adresse est par exemple <SIP:serveur_exemple.com> et votre nom d'utilisateur est “Bob”. Linphone va alors envoyer au serveur un message pour l'informer de la correspondance entre l'adresse <SIP:bob@serveur_exemple.com> et votre adresse IP actuelle. Désormais vos amis peuvent vous appeler en utilisant cette nouvelle adresse, leurs appels seront alors automatiquement redirigés vers votre machine. Il n'ont plus besoin de connaitre votre adresse IP qui change tout le temps pour vous joindre. Bien sur, <SIP:serveur_exemple.com> est supposée être bien connue de tout vos amis.

sans_titre23

sans_titre32

2. Avantages et inconvénients de SIP

a. Avantages

          -  Ouvert : les protocoles et documents officiels sont détaillés et accessibles à tous en téléchargement

-  Standard : l'IETF a normalisé le protocole et son évolution continue par la création ou l'évolution d'autres protocoles qui fonctionnent avec SIP

-  Simple : SIP est simple voire simpliste et très similaire à HTTP

- P2P : sur un LAN, SIP fonctionne complètement en P2P (encore plus facilement avec l'intégration de Zeroconf), ce n'est pas le cas pour l'établissement de sessions entre deux pairs séparés par un NAT

-  Flexible : SIP est également utilisé pour tout type de sessions multimédia (voix, vidéo, mais aussi musique, réalité virtuelle, etc.)

- Téléphonie sur réseaux publics : il existe de nombreuses passerelles (services payants) vers le réseau public de téléphonie (RTC, GSM, etc.) permettant d'émettre ou de recevoir des appels vocaux

-  Points communs avec H323 : l'utilisation du protocole RTP et quelques codecs son et vidéo sont en commun

b. inconvénients

-  Basé sur l'adresse IP : SIP ne traverse pas les NAT, mais cela peut être résolu en déployant des mécanismes client-serveur supplémentaires comme STUN ou en couplant SIP avec Jabber

-  Mauvaise implémentation : une mauvaise implémentation ou une implémentation incomplète du protocole SIP dans les User Agents peut perturber le fonctionnement ou générer du trafic superflu sur le réseau.

-  Existant : H323 (standard et ouvert) et Skype (propriétaire) bénéficient de leur effet réseau respectif, bien que H323 tende à disparaître au profit de SIP

-  Présence et messagerie instantanée : SIP montre un certain nombre de faiblesses dans la gestion de la présence et la messagerie instantanée, mais l'intégration du standard ouvert spécialisé Jabber résout la plupart de ces problèmes

-  Faible nombre d'utilisateurs : SIP est encore peu connu et utilisé par le grand public, n'ayant pas atteint une masse critique, il ne bénéficie pas de l'effet réseau

Conclusion

SIP est un protocole simple, rapide et efficace. De plus, malgré sa légèreté d’utilisation, il est très complet. Il inclut aussi une partie sécurité importante qui en fait un protocole fiable et utilisable dans de nombreux cas d’utilisation.

20 juin 2006

Ant : Description

Introduction :

Vous connaissez surement le programme make permettant de compiler des sources C. Apache a développé une similitude pour java, appelée Ant.Programmé en Java, il permet d’automatiser diverses tâches répétitives que l’on fait durant le développement d’un projet.

Ses actions sont les suivantes :

  • Compiler
  • Copier/supprimer des fichiers
  • Faire des checkout/update/commit sur un CVS
  • Envoyer des mails, déployer l’application
  • Exécuter du code
  • etc...

Il est fait en Java, et principalement pour Java, mais on peut également l’utiliser pour des projets qui utilisent d’autres languages. Ant est gratuit et opensource (Apache License, Version 2.0)

Vous pouvez le télécharger à l'adresse suivante : http://ant.apache.org/bindownload.cgi

Apres avoir téléchargé le fichier, vous devez l'installer puis le configurer.

Configuration sous Linux:

Afin de configurer convenablement ant, il faut créer une variable d’environnement nommé ANT_HOME dont la valeur sera le chemin du répertoire d’installation de ant.

Pour ce faire, éditez le fichier .bashrc situé sur la racine ~ de votre repertoire.

exemple : cd ~

insérez une ligne dans le fichier .bashrc :

export ANT_HOME=chemin complet du repertoire ou vous avez installé ant

exemple : export ANT_HOME=/home/brunetlo/apache-ant-1.6.5/

Il faut également modifier la variable d’environnement PATH pour y ajouter le chemin complet du répertoire bin se trouvant dans le répertoire d’installation.

exemple : export PATH = $PATH:ANT_HOME/bin

vous avez maintenant configuré le chemin afin que les librairies ant soient retrouvée.

Utilisation :

Ant permet d'effectuer des taches. Il le fait via un fichier XML décrivant ce qu'il faut faire. Le fichier XML doit absolument se nommer build.xml et doit se trouver dans la racine du projet.

Voici un exemple de fichier XML exécutant des taches de compilation :

<?xml version="1.0" encoding="UTF-8"?>
<project name="monProjet" basedir=".">

        <target name="Tache">

               <!-- création d'un répertoire pour la compilation -->
               <mkdir dir="build"/>

               <!-- compilation des sources Java -->
               <javac srcdir="src" destdir="build"/>

               <!-- exécution du code compilé -->
               <java classpath="build" classname="nomDuPackage.ClassePrincipale" fork="true"/>
        </target>

</project>

Explication du fichier XML ci-dessus :

La racine du document, l’élement project, possède trois attributs :

  • name : Le nom du projet.

  • basedir : Le répertoire de base pour tout les path qui sont dans le fichier.

  • default : Le target exécuté par défaut si on envoi aucun paramêtre à l’exécution de ant.

L’élément target possède cinq attributs :

  • name : Le nom du target (obligatoire)

  • depends : Une liste de nom de target séparé par des virgules. Ces target seront exécuter avant le target en question.

  • if : Le target sera exécuté seulement si la propriété(valeur de l’attribut) est déclaré.

  • unless : Le target sera exécuté seulement si la propriété(valeur de l’attribut) n’est pas déclaré.

  • description : Petite description du target.

Note : l’attribute fork de la tâche java indique que le code sera exécuté dans nouvelle JVM (nouveau process), donc l’application sera indépendante de Ant une fois lancé.

Les Propriétés :

Si la structure du projet est modifié, il ne faut pas avoir à rafaire tous les chemins du projet. C'est pour cela qu'on utilise les propriétés.

exemple de build.xml :

<?xml version="1.0" encoding="UTF-8"?>
<project name="monProjet" basedir=".">

        <property name="src.dir" value="src"/>
        <property name="build.dir" value="build"/>
        <property name="main-class" value="monpackage.ClassePrincipale"/>

<target name="Tache">

<!-- création d'un répertoire pour la compilation -->
<mkdir dir="${build.dir}"/>

<!-- compilation des sources Java -->
<javac srcdir="${src.dir}" destdir="${build.dir}"/>

<!-- exécution du code compilé -->
<java classpath="${build.dir}" classname="${main-class}" fork="true"/>
</target>

</project>

Ansi, si votre fichier de configuration utilise plusieur fois le repertoire de compilation, et que vous voulez modifier le nom de celui-ci, il suffit de modifier la propriété indiquant le nom du répertoire.

Il faut déclarer la propriété de la manière suivante :

<property name="nomDeLaPropriété" value="valeurDeLaPropriété"/>

Dans l'exemple ci dessus build.dir représente le nom de la propriété, et build représente le répertoire physique où doit se trouver les fichiers compilés.

Pour utiliser les propriétés, la syntaxe est la suivante : ${nom.de.la.propriete} (voir exemple plus haut)

Fichier de propriétés externe

Il est possible d’extraire les propriétés et de les mettres dans un fichier externe.

Créer le fichier build.properties dans la racine de votre projet (même dossier que le build.xml)

#build.properties
src.dir=src
build.dir=build
dist.dir=dist
main-class=exemple.HelloWorld

Vous devez ensuite ajouter une ligne dans votre fichier XML pour indiquer comment se nomme le fichier de propriété.

<property file="build.properties"/>

Packager son application

On peut aussi demander au fichier XML d'exécuter plusieurs tâches différentes.

Voici un exemple :

  • clean : sont rôle est de supprimer les classes compilé et le JAR

  • compile : sont rôle est de compiler le code source Java

  • create-jar : sont rôle est de créer un JAR exécutable, il dépend du target clean et compile

  • run : sont rôle est d’exécuter l’application

  • build-and-run : sont rôle est de recompiler et exécuter l’application

Voici maintenant un exemple du fichier XML :

<?xml version="1.0" encoding="UTF-8"?>
<project name="monProjet" basedir="." default="compile">

        <!-- on inclu les propriétés -->
        <property file="build.properties"/>

        <!-- target qui supprime les classes compilé et le JAR -->
        <target name="clean">
                <delete dir="${build.dir}"/>
                <delete dir="${dist.dir}/${ant.project.name}.jar"/>
        </target>

        <!-- target qui compile le code Java dans le répertoire build -->
<target name="compile">

<!-- création d'un répertoire pour la compilation -->
<mkdir dir="${build.dir}"/>

<!-- compilation des sources Java -->
<javac srcdir="${src.dir}" destdir="${build.dir}"/>
               
</target>


        <!-- target qui crée le JAR -->
        <target name="create-jar" depends="clean,compile">
               
                <!-- création d'un répertoire pour le JAR -->
<mkdir dir="${dist.dir}"/>

                <!-- création du JAR, dans mon exemple son nom sera "monProjet.jar" -->
                <jar destfile="${dist.dir}/${ant.project.name}.jar" basedir="${build.dir}">
<manifest>
                                <!-- on indique la classe principale du JAR-->
<attribute name="Main-Class" value="${main-class}"/>
</manifest>
</jar>

</target>


        <!-- exécution du JAR -->
        <target name="run">
                <java jar="${dist.dir}/${ant.project.name}.jar" fork="true"/>
</target>

        <target name="build-and-run" depends="create-jar,run" />
               
</project>

Pour exécuter les taches il suffit de taper les lignes suivantes :

  • ant clean : Supprime les classes compilé et le JAR
  • ant compile : Compile le code source du projet
  • ant create-jar : Supprime les classes compilé et le JAR, compile le code source de mon projet et crée un JAR
  • ant run : Exécute le JAR
  • ant build-and-run : Exécute les taches create-jar et run

20 juin 2006

Bienvenue

Bienvenue sur ce nouveau blog.

Vous pourrez y découvrir de nombreux tutoriaux sur la programmation, basés sur des exemples simple.

A tres bientot sur ce blog.

Le premier article sera consacré à Ant.

Publicité
Publicité
Publicité