<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Romain Bouleis&#039; Blog</title>
	<atom:link href="http://www.bouleis.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bouleis.fr</link>
	<description>Passionné d&#039;informatique, je vous transmets via ce blog mes différents travaux</description>
	<lastBuildDate>Thu, 18 Dec 2008 14:41:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Simulation d&#8217;un petit monde &#8230;</title>
		<link>http://www.bouleis.fr/2008/12/16/simulation-dun-petit-monde/</link>
		<comments>http://www.bouleis.fr/2008/12/16/simulation-dun-petit-monde/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 17:43:52 +0000</pubDate>
		<dc:creator>Romain Bouleis</dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[SMA]]></category>

		<guid isPermaLink="false">http://www.bouleis.fr/?p=48</guid>
		<description><![CDATA[Avant-propos
Les sources et l&#8217;exécutable du programme de simulation sont disponibles ici : simulation d&#8217;un petit monde.
L&#8217;article complet (incluant le guide d&#8217;utilisation et une description technique est disponible ici : Article sur la simulation du petit monde
Introduction
Dans le cadre d’un cours sur les systèmes multi-agents (SMA), il nous a été demandé d’imaginer une application mettant en [...]]]></description>
			<content:encoded><![CDATA[<h1><span>Avant-propos</span></h1>
<p>Les sources et l&#8217;exécutable du programme de simulation sont disponibles ici : <a href="http://www.bouleis.fr/public//petit_monde.zip">simulation d&#8217;un petit monde</a>.</p>
<p>L&#8217;article complet (incluant le guide d&#8217;utilisation et une description technique est disponible ici : <a href="http://www.bouleis.fr/public//le-petit-monde.pdf">Article sur la simulation du petit monde</a></p>
<h1><span>Introduction</span></h1>
<p class="MsoNormal"><span>Dans le cadre d’un cours sur les systèmes multi-agents (SMA), il nous a été demandé d’imaginer une application mettant en œuvre des agents logiciels. Pour ce faire, il nous était conseillé d’utiliser l’environnement <em>MadKit http://www.madkit.org/</em>. MadKit est une plateforme facilitant le développement des SMA.</span></p>
<p class="MsoNormal"><span>Libre de choisir le type de simulation, nous avons décidé de vérifier la théorie de Frigyes Karinthy selon laquelle « toute personne sur le globe peut être reliée à n&#8217;importe quelle autre, au travers d&#8217;une chaîne de relations individuelles comprenant au plus cinq autres maillons » (source : Wikipédia).</span></p>
<p class="MsoNormal"><span>Nous allons donc simuler un petit monde, avec un nombre donné de personnes, ayant des liens amicaux les unes envers les autres, puis vérifier que deux personnes prisent au hasard sont reliées par cinq maillons (amis d’amis d’amis…).</span></p>
<p class="MsoNormal"><span>Mais avant tout, pour mieux situer l’expérience, il est intéressant de voir le résultat :</span></p>
<div id="attachment_49" class="wp-caption aligncenter" style="width: 509px"><a href="http://www.bouleis.fr/public//world1.png"><img class="size-full wp-image-49" title="Copie d'écran de la simulation" src="http://www.bouleis.fr/public//world1.png" alt="Simulation du petit monde" width="499" height="513" /></a><p class="wp-caption-text">Simulation du petit monde</p></div>
<p class="MsoNormal"><span>C’est donc une copie d’écran du petit monde où :</span></p>
<ul>
<li><!--[if !supportLists]--><span>Les petits points rouges sont des personnes cherchant des « amis ». Elles sont en mouvement.</span></li>
<li><span>Les petits points bleus foncés sont des personnes « épanouies », elles ne cherchent plus d’amis, elles en ont suffisamment. Elles ne bougent plus.</span></li>
<li><span>L</span><span>e point jaune est la personne qui a voulu évaluer la distance la séparant d’une autre personne prise au hasard.</span></li>
<li><span>Les carrés bleus ciels sont les personnes<span> </span>se trouvant entre la personne « jaune » et la personne choisie. Celle-ci est représentée par le carré bleu au bout du chemin</span></li>
</ul>
<p class="MsoNormal"><!--[if !supportLists]--><!--[endif]--><!--[if !supportLists]--><!--[endif]--><span>Remarque : est-ce un hasard s’il y a cinq personnes sur le chemin ?</span></p>
<h2><span>Aspects scientifiques de la simulation</span></h2>
<h3 style="margin-left: 36pt; text-indent: -18pt;"><!--[if !supportLists]--><span><span>1.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;"> </span></span></span><!--[endif]--><span>Déroulement du programme</span></h3>
<p class="MsoNormal"><span>La première chose à faire est de construire le monde. Ceci consiste à créer les personnes qui vont servir à la simulation. Une fois ajoutées au monde, ces personnes vont alors se socialiser : elles vont se déplacer afin de se faire des amis. Pour que la simulation colle à la réalité, les personnes ont un nombre d’amis limité. Une fois cette limite atteinte, elles arrêteront de se déplacer et attendrons.</span></p>
<p class="MsoNormal"><span>Parmi ces personnes, certaines auront un rôle supplémentaire dans la simulation : à la demande de l’utilisateur, elles choisiront une personne au hasard dans le monde afin de connaître la distance qui les sépare. Par la suite, ces personnes seront dîtes « observables ».</span></p>
<h3 style="margin-left: 36pt; text-indent: -18pt;"><!--[if !supportLists]--><span><span>2.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;"> </span></span></span><!--[endif]--><span>Le lien social</span></h3>
<p class="MsoNormal"><span>Il est évident que simuler le monde dans sa globalité est impossible. En effet, il faudrait simuler les interactions de plus de six milliards de personnes ; simuler toutes les relations qui peuvent lier deux personnes : liens familiaux, liens amicaux, liens professionnels etc. Il faudrait aussi simuler les différents « groupes » sociaux : personnes ayant la même langue, personnes polyglottes etc.<span> </span></span></p>
<p class="MsoNormal"><span>Pour simplifier ces problèmes, nous avons imaginé un seul lien entre les personnes : elles ne seront amies que si elles parlent la même langue. Ceci engendrant des communautés non liables, un certain taux de personnes seront bilingues. </span></p>
<h3 style="margin-left: 36pt; text-indent: -18pt;"><!--[if !supportLists]--><span><span>3.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;"> </span></span></span><!--[endif]--><span>Les paramètres</span></h3>
<p class="MsoNormal"><span>Les paramètres sont très importants, ils conditionnent les résultats. En effet, imaginons que les personnes puissent avoir un nombre d’amis égal au nombre de personnes dans la simulation et que toutes les personnes parlent la même langue, alors la distance les séparant serait nulle.</span></p>
<p class="MsoNormal"><span>De ce fait, un certain nombre de paramètres permettent de « jouer » sur les résultats :</span></p>
<ul>
<li><!--[if !supportLists]--><span style="font-family: Symbol;"><span><span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;"> </span></span></span><!--[endif]--><span>Le nombre de personnes dans le monde: plus il y en a, plus les chemins risquent d’être longs. Il est fixé à 20 000.</span></li>
</ul>
<ul>
<li><!--[if !supportLists]--><span style="font-family: Symbol;"><span><span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;"> </span></span></span><!--[endif]--><span>Le nombre de langues qu’il existe dans le monde : de même, plus il y a de langues, plus il y a de communautés difficiles à relier. Nous avons choisi 5 langues.</span></li>
</ul>
<p><!--[if !supportLists]--><!--[endif]--></p>
<ul>
<li><span>Les nombres minimum et maximum d’amis qu’une personne peut avoir. Plus ces chiffres sont élevés, plus les chemins seront courts. Ce sont les paramètres à augmenter si le nombre de personnes est augmenté. Ils sont fixés à 5 pour le minimum et à 15 pour le maximum.</span></li>
</ul>
<ul>
<li><!--[if !supportLists]--><span style="font-family: Symbol;"><span><span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;"> </span></span></span><!--[endif]--><span>Le taux de personnes bilingues : les bilingues permettent des liens entre les communautés. Plus il y a de langues, plus ce taux doit être important. Il est fixé à 20%.</span></li>
</ul>
<p class="MsoNormal"><span>Autrement dit, notre simulation peut être résumée comme suit : dans un monde de 20 000 personnes, parlant un total de 5 langues équitablement réparties, dont 20% sont bilingues, chaque personne ayant au moins 5 connaissances et au maximum 15, la théorie de Frigyes Karinthy est-elle vérifiée ?</span></p>
<h3 style="margin-left: 36pt; text-indent: -18pt;"><!--[if !supportLists]--><span><span>4.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;"> </span></span></span><!--[endif]--><span>Détermination du chemin le plus court</span></h3>
<p class="MsoNormal"><span>La plus grande difficulté de cette simulation réside dans la détermination du plus court chemin. L’idée est la suivante :</span></p>
<ul>
<li><!--[if !supportLists]--><span style="font-family: Symbol;"><span><span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;"> </span></span></span><span>La personne souhaitant connaitre la distance la séparant d’une autre va écrire un message. Ce message contiendra le nom de la personne destinatrice ainsi que le nom de la personne source. De plus, un espace sera réservé pour une liste de personnes intermédiaires.</span></li>
</ul>
<ul>
<li><!--[if !supportLists]--><span>La source va alors s’ajouter aux intermédiaires et envoyer le message à tous ses amis.</span></li>
</ul>
<ul>
<li><!--[if !supportLists]--><span style="font-family: Symbol;"><span><span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;"> </span></span></span><!--[endif]--><span>Les amis vont alors regarder à destination de qui est ce message. Chaque ami va alors vérifier le destinataire du message. Si c’est lui même, alors il le garde précieusement. Sinon, il le duplique, s’ajoute à la liste des intermédiaires et l’envoie aussi à tous ses amis.</span></li>
</ul>
<ul>
<li><!--[if !supportLists]--><span>Si par hasard une personne recevait plusieurs fois le même message, alors elle regarderait la taille du chemin (taille de la liste des intermédiaires). Si celui-ci est plus court que les fois précédentes, alors elle le renverra à ses amis après s’être ajouté à la liste des intermédiaires, sinon, elle n’en fera rien.</span></li>
</ul>
<ul>
<li><!--[if !supportLists]--><span style="font-family: Symbol;"><span><span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;"> </span></span></span><span>Ainsi de suite, jusqu’à ce que, s’il existe un chemin, le message arrive à destination.</span></li>
</ul>
<ul>
<li><!--[if !supportLists]--><span style="font-family: Symbol;"><span><span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;"> </span></span></span><!--[endif]--><span>De cette manière, le destinataire peut recevoir plusieurs fois le même message, il les garde tous en les triant par ordre de taille de chemin croissant.</span></li>
</ul>
<h2><span>Conclusion</span></h2>
<p class="MsoNormal"><span>Concernant les résultats, ils sont conformes à nos attentes. Les chemins sont dans la majorité d’une longueur inférieure ou égale à 5 intermédiaires. Néanmoins, il faut nuancer ceci. En effet, comme nous l’avons montré dans la première partie, ils sont conditionnés par les valeurs globales choisies (nombre de personnes dans le monde, taux de bilingues, etc.).<span> </span>Donc, « dans un monde de 20 000 personnes, parlant un total de 5 langues équitablement réparties, dont 20% sont bilingues, chaque personne ayant au moins 5 connaissances et au maximum 15 » <span> </span>la théorie de Frigyes Karinthy est vérifiée.</span></p>
<p class="MsoNormal"><span>Concernant l’application et son développement, nous sommes particulièrement satisfaits du système de détermination du chemin le plus court. En effet, celui-ci est très orienté « SMA » et il reflète ce qui pourrait réellement se passer si cette expérience était effectuée grandeur nature.</span></p>
<p class="MsoNormal"><span>Pour le plaisir, une dernière copie d’écran avec deux personnes observables :</span></p>
<div id="attachment_50" class="wp-caption aligncenter" style="width: 509px"><a href="http://www.bouleis.fr/public//world3.png"><img class="size-full wp-image-50" title="Copie d'écran de la simulation avec deux chemins" src="http://www.bouleis.fr/public//world3.png" alt="Copie d'écran de la simulation avec deux chemins" width="499" height="513" /></a><p class="wp-caption-text"> </p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.bouleis.fr/2008/12/16/simulation-dun-petit-monde/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Langage de représentation de frames (FRL) en Smalltalk</title>
		<link>http://www.bouleis.fr/2008/06/15/langage-de-representation-de-frames-frl-en-smalltalk/</link>
		<comments>http://www.bouleis.fr/2008/06/15/langage-de-representation-de-frames-frl-en-smalltalk/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 16:12:03 +0000</pubDate>
		<dc:creator>Romain Bouleis</dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Smalltalk]]></category>

		<guid isPermaLink="false">http://www.bouleis.fr/?p=45</guid>
		<description><![CDATA[Il existe différents moyens de représenter les connaissances ; les systèmes à base de schémas sont l&#8217;un de ces moyens. Il tiennent leur origine de l&#8217;intelligence artificielle et de la psychologie. Ces systèmes sont nécessaires car les « éléments » de la connaissance doivent être regroupés et structurés.
Parmi ces systèmes, on retrouve le « frame representation language ». Il [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Il existe différents moyens de représenter les connaissances ; les systèmes à base de schémas sont l&#8217;un de ces moyens. Il tiennent leur origine de l&#8217;intelligence artificielle et de la psychologie. Ces systèmes sont nécessaires car les « éléments » de la connaissance doivent être regroupés et structurés.</p>
<p>Parmi ces systèmes, on retrouve le « frame representation language ». Il a été développé par Marvin Minsky au Massachusetts Institute of Technology avec le concept de frame et le « Frame Representation Language ».  Ce dernier est constitué de plusieurs éléments :</p>
<ul>
<li>Des frames : Ce sont des structures de données complexes qui représentent des concepts. Elles ont un nom et une série d&#8217;attributs appelés des slots.</li>
<li> Des slots : Ce sont des propriétés de la frame, ils définissent la structure de données. Par exemple, un concept peut nécessiter d&#8217;avoir un type, une durée, on utilisera les slots pour les représenter.</li>
<li>Des facettes : Chaque slot comporte ce qu&#8217;on appelle des facettes, qui sont au nombre de 3. La première est la valeur du slot, c&#8217;est une facette déclarative. Les deux autres sont des facettes procédurales. Elles comportent du code à exécuter appelé « attachement procédural ». Elles sont activées à chaque accès à la valeur du slot. La première, « if-added » est exécutée à chaque ajout de valeur à la facette « value », la seconde, « if-needed » lorsque la facette « value » n&#8217;a pas de valeur.</li>
<li> Des relations : Il existe des relations entre les frames. Elles sont représentées par des slots. Une relation particulière est la relation ako, autrement dit la relation d&#8217;héritage, elle permet l&#8217;accès aux attributs de la frame mère. Des exemples de relations non héritées sont « instance », « possède », etc &#8230;</li>
</ul>
<p>Le frame representation language permet donc une programmation dirigée par les données. Les appels se font par effets de bord.</p></blockquote>
<p style="text-align: center;"><a href="http://www.bouleis.fr/public//appli_rc.png"><img class="size-medium wp-image-46" title="FRL" src="http://www.bouleis.fr/public//appli_rc-300x284.png" alt="Application" width="300" height="284" /></a></p>
<p><a href="http://www.bouleis.fr/public//frl.pdf">Télécharger le rapport complet</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bouleis.fr/2008/06/15/langage-de-representation-de-frames-frl-en-smalltalk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compilation : génération d&#8217;une table LR0 en Java</title>
		<link>http://www.bouleis.fr/2008/05/19/compilation-generation-dune-table-lr0-en-java/</link>
		<comments>http://www.bouleis.fr/2008/05/19/compilation-generation-dune-table-lr0-en-java/#comments</comments>
		<pubDate>Mon, 19 May 2008 19:42:25 +0000</pubDate>
		<dc:creator>Romain Bouleis</dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Compilation]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.bouleis.fr/2008/compilation-generation-dune-table-lr0/</guid>
		<description><![CDATA[Après un long moment d&#8217;inactivité, voici une réalisation à laquelle j&#8217;ai énormément contribuée.
Extrait du cahier des charges :

La construction d’une table de reconnaissance LR0 répond à un besoin bien précis dans la phase de conception d’un compilateur : l’analyse syntaxique. Selon la complexité de la grammaire, la table LR0 pourrait ne pas être suffisante pour [...]]]></description>
			<content:encoded><![CDATA[<p>Après un long moment d&#8217;inactivité, voici une réalisation à laquelle j&#8217;ai énormément contribuée.</p>
<p>Extrait du cahier des charges :</p>
<blockquote>
<p>La construction d’une table de reconnaissance LR0 répond à un besoin bien précis dans la phase de conception d’un compilateur : l’analyse syntaxique. Selon la complexité de la grammaire, la table LR0 pourrait ne pas être suffisante pour une analyse syntaxique complète, il faudrait envisager dans ce cas là une table LR1 ou LALR. De plus, on dit d’une grammaire qu’elle est compatible avec une analyse LR si :</p>
<ul>
<li>Les alternatives ont été supprimées,</li>
<li>Un axiome supplémentaire a été rajouté.</li>
</ul>
<p> Notre travail est donc d’établir cette table à partir des productions d’une grammaire donnée. Si, au cours du programme, il apparaissait que la grammaire est ambigüe, un message d’erreur le signalera, mais n’empêchera pas le programme de se terminer. Il en résultera une table non exploitable telle quel.</p>
<p>En plus d’être fournie au groupe chargé de l’analyse syntaxique, il convient de la fournir sous un format très facilement compréhensible afin de vérifier manuellement sa validité. La construction d’une table LR0 se répartit de la manière suivante :</p>
<ul>
<li>Suppression des alternatives,</li>
<li>Ajout de l’axiome pour obtenir une grammaire augmentée,</li>
<li>Déduction de la collection d’item initiale issue de la grammaire augmentée grâce à fermeture(I) ou I est l’axiome ajouté,</li>
<li>Détermination de la table des fermetures,</li>
<li>Déduction de la table des transitions,</li>
<li>Détermination des suivants,</li>
<li>Construction de la table LR0 à partir de la table des transitions et des suivants.</li>
</ul>
</blockquote>
<p>Ce mini projet a été réalisé en Java, voici toutes les ressources :</p>
<ul>
<li>Le programme (java 1.5) et ses sources : <a href="/public/Compilation/lr0.jar">lr0.jar</a></li>
<li>Les librairies <a href="/public/Compilation/jdom.jar">jdom</a> [<a href="http://www.jdom.org/">site</a>] et <a href="/public/Compilation/jxl.jar">jxl</a> [<a href="http://sourceforge.net/projects/jxl/">site</a>]</li>
<li>La <a href="/public/Compilation/javadoc/">javadoc</a></li>
<li>Le rapport complet en pdf, avec les sources (88 pages) : <a href="/public/Compilation/lr0.pdf">lr0.pdf</a></li>
</ul>
<p>
Toutes les remarques seront les bienvenues.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bouleis.fr/2008/05/19/compilation-generation-dune-table-lr0-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Developpement d&#8217;une infrastructure Peer-to-Peer (P2P) centralisée en Java/RMI</title>
		<link>http://www.bouleis.fr/2008/01/22/developpement-dune-infrastructure-peer-to-peer-p2p-centralisee-en-javarmi/</link>
		<comments>http://www.bouleis.fr/2008/01/22/developpement-dune-infrastructure-peer-to-peer-p2p-centralisee-en-javarmi/#comments</comments>
		<pubDate>Tue, 22 Jan 2008 18:35:02 +0000</pubDate>
		<dc:creator>Romain Bouleis</dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Réseaux]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RMI]]></category>
		<category><![CDATA[swing]]></category>

		<guid isPermaLink="false">http://www.bouleis.fr/2008/developpement-dune-infrastructure-peer-to-peer-p2p-centralisee-en-javarmi/</guid>
		<description><![CDATA[
Dans le cadre d&#8217;un mini-projet, nous avons choisi de mettre en place un réseau Peer-to-Peer centralisé. Ce réseau est donc composé d&#8217;un serveur et de clients devant s&#8217;y connecter lors de la recherche de fichiers. Ce réseau est implémenté en RMI afin de faciliter les communications entre les différents éléments. Les principes de transfert de [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
<p class="text-body-indent" align="justify">Dans le cadre d&#8217;un mini-projet, nous avons choisi de mettre en place un réseau Peer-to-Peer centralisé. Ce réseau est donc composé d&#8217;un serveur et de clients devant s&#8217;y connecter lors de la recherche de fichiers. Ce réseau est implémenté en RMI afin de faciliter les communications entre les différents éléments. Les principes de transfert de données basiques tels que l&#8217;utilisation de sockets sont ainsi masqués.</p>
<p class="text-body-indent" align="justify">Notre implémentation permet :</p>
<ul>
<li>
<p class="text-body-indent" align="justify">La recherche de 	fichier selon un mot clé,</p>
</li>
<li>
<p class="text-body-indent" align="justify">Le <span lang="fr-FR">téléchargement</span> 	d&#8217;un fichier depuis plusieurs sources simultanément,</p>
</li>
<li>
<p class="text-body-indent" align="justify">Le téléchargement 	de plusieurs fichiers simultanément,</p>
</li>
<li>
<p class="text-body-indent" align="justify">La reprise du 	téléchargement d&#8217;un fichier partiellement téléchargé,</p>
</li>
<li>
<p class="text-body-indent" align="justify">La déconnexion 	« sauvage » des clients.</p>
</li>
</ul>
<p class="text-body-indent" align="justify">Néanmoins, il n&#8217;est pas possible :</p>
<ul>
<li>
<p class="text-body-indent" align="justify">De partager des 	parties de fichier non complet (un fichier en cours de 	téléchargement ne peut être téléchargé 	par d&#8217;autres peers simultanément),</p>
</li>
<li>
<p class="text-body-indent" align="justify">De contrôler les 	vitesses d&#8217;émission et de réception.</p>
</li>
</ul>
<p class="text-body-indent">Nous pouvons néanmoins ajouter que l&#8217;architecture de notre application ne poserait aucun problème à qui voudrait implémenter ces fonctionnalités.</p>
<p><a href="http://www.bouleis.fr/public//transfert1.png" title="Téléchargement de fichiers"><img src="http://www.bouleis.fr/public//transfert1.thumbnail.png" alt="Téléchargement de fichiers" /></a></p>
<p><a href="http://www.bouleis.fr/public//partage.png" title="Partage de fichiers"><img src="http://www.bouleis.fr/public//partage.thumbnail.png" alt="Partage de fichiers" /></a></p>
</blockquote>
<p><a href="http://www.bouleis.fr/public//client.jar" title="Le client">Le client (jar executable, incluant jdom et fast md5)</a><br />
<a href="http://www.bouleis.fr/public//server.jar" title="Le serveur">Le serveur (jar executable)</a><br />
<a href="http://www.bouleis.fr/public//sources.zip" title="Les sources">Les sources du client et du serveur (incluant jdom et fast md5)</a><br />
<a href="http://www.bouleis.fr/public//rapport.pdf" title="Le rapport">Le rapport</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bouleis.fr/2008/01/22/developpement-dune-infrastructure-peer-to-peer-p2p-centralisee-en-javarmi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Afficher une exception dans un JOptionPane en Java</title>
		<link>http://www.bouleis.fr/2008/01/02/afficher-une-exception-dans-un-joptionpane-en-java/</link>
		<comments>http://www.bouleis.fr/2008/01/02/afficher-une-exception-dans-un-joptionpane-en-java/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 22:18:14 +0000</pubDate>
		<dc:creator>Romain Bouleis</dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[swing]]></category>

		<guid isPermaLink="false">http://www.bouleis.fr/2008/afficher-une-exception-dans-un-joptionpane-en-java/</guid>
		<description><![CDATA[Quel développeur n&#8217;utilise pas &#171;&#160;e.printStrackTrace()&#187;&#160; ou &#171;&#160;System.out.println(e)&#187;&#160; ? Ceci est très pratique, voir indispensable lors de l&#8217;écriture d&#8217;un programme. Mais que devient le sort de ces instructions lors de l&#8217;utilisation de l&#8217;application une fois finie ? Au mieux, quelques lignes incompréhensibles par l&#8217;utilisateur si l&#8217;application a été lancée dans un terminal, sinon rien. Au final, [...]]]></description>
			<content:encoded><![CDATA[<p>Quel développeur n&#8217;utilise pas &laquo;&nbsp;e.printStrackTrace()&raquo;&nbsp; ou &laquo;&nbsp;System.out.println(e)&raquo;&nbsp; ? Ceci est très pratique, voir indispensable lors de l&#8217;écriture d&#8217;un programme. Mais que devient le sort de ces instructions lors de l&#8217;utilisation de l&#8217;application une fois finie ? Au mieux, quelques lignes incompréhensibles par l&#8217;utilisateur si l&#8217;application a été lancée dans un terminal, sinon rien. Au final, un cas non prévu par le développeur qui peut entrainer un bug.</p>
<p>Un solution consiste à afficher l&#8217;erreur dans une fenêtre plutôt que dans la console. Pour ce faire, j&#8217;ai écrit une méthode permettant d&#8217;afficher une exception et son détail dans un JOptionPane et de laisser le choix à l&#8217;utilisateur de continuer ou d&#8217;interrompre l&#8217;exécution du programme.</p>
<p><a href="http://www.bouleis.fr/public//exception1.png" title="Exception JOptionPane 1"></a></p>
<div style="text-align: center"><a href="http://www.bouleis.fr/public//exception1.png" title="Exception JOptionPane 1"><img src="http://www.bouleis.fr/public//exception1.png" alt="Exception JOptionPane 1" /></a></div>
<p><a href="http://www.bouleis.fr/public//exception2.png" title="Exception JOptionPane 2"></a></p>
<div style="text-align: center"><a href="http://www.bouleis.fr/public//exception2.png" title="Exception JOptionPane 2"><img src="http://www.bouleis.fr/public//exception2.png" alt="Exception JOptionPane 2" /></a></div>
<p>Voici le code source permettant d&#8217;afficher l&#8217;exception :</p>
<pre>
<code>
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.io.StringWriter;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 *
 * @author Romain Bouleis
 *
 */
public class Tools {
	public static void showError(Exception e) {
		//stock la trace d'execution dans une String
		StringWriter sw = new StringWriter();
		e.printStackTrace(new PrintWriter(sw));

		//cree un JTextArea pour afficher le contenu de l'exception
		JTextArea textArea = new JTextArea(sw.toString(),20,40);
		textArea.setEditable(false);
		textArea.setBorder(BorderFactory.createTitledBorder("Détails de l'exception"));
		final JScrollPane scrollPane = new JScrollPane(textArea);
		scrollPane.setVisible(false);

		//boutton details
		JButton details = new JButton("Détails...");
		details.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				scrollPane.setVisible(!scrollPane.isVisible());
				JDialog dialog =  (JDialog) ((JComponent) e.getSource()).getRootPane().getParent();
				dialog.pack();
			}
		});

		//boutton continuer
		JButton ok = new JButton("Continuer");
		ok.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JDialog dialog =  (JDialog) ((JComponent) e.getSource()).getRootPane().getParent();
				dialog.dispose();
			}
		});

		//boutton exit
		JButton cancel = new JButton("Arrêter");
		cancel.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});

		//placement des composants
		JPanel buttonsPanel = new JPanel(new FlowLayout());
		buttonsPanel.add(ok);
		buttonsPanel.add(cancel);
		buttonsPanel.add(details);

		JPanel mainPanel = new JPanel(new BorderLayout());
		mainPanel.add(scrollPane, BorderLayout.CENTER);
		mainPanel.add(buttonsPanel,BorderLayout.SOUTH);

		//affichage du message
		JOptionPane.showOptionDialog(null, e.getMessage(), "Erreur", JOptionPane.OK_OPTION, JOptionPane.ERROR_MESSAGE, null, new Object[]{mainPanel}, ok);
	}

	public static void main(String[] args) {
		Tools.showError(new Exception("Une erreur !"));
	}
}
</code></pre>
<p>Désormais, vos &laquo;&nbsp;try-catch&raquo;&nbsp; ressembleront plutôt à ceci :</p>
<pre>
<code>
try {
	int error = 69/0;
} catch (Exception e) {
	Tools.showError(e);
}
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bouleis.fr/2008/01/02/afficher-une-exception-dans-un-joptionpane-en-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Système Expert en Smalltalk</title>
		<link>http://www.bouleis.fr/2007/12/20/systeme-expert-en-smalltalk/</link>
		<comments>http://www.bouleis.fr/2007/12/20/systeme-expert-en-smalltalk/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 10:17:32 +0000</pubDate>
		<dc:creator>Romain Bouleis</dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Smalltalk]]></category>

		<guid isPermaLink="false">http://www.bouleis.fr/2007/systeme-expert-en-smalltalk/</guid>
		<description><![CDATA[Système expert de diagnostic de panne de connexion Internet

 Un système expert est un outil permettant de mettre en application un type d&#8217;intelligence artificielle. Son rôle est de reproduire le raisonnement d&#8217;un expert dans un domaine donné. Le premier système expert se nomme Dendral et permet d&#8217;identifier des constituants chimiques.
Pour réaliser une expertise, il doit [...]]]></description>
			<content:encoded><![CDATA[<h2>Système expert de diagnostic de panne de connexion Internet</h2>
<blockquote>
<p> Un système expert est un outil permettant de mettre en application un type d&#8217;intelligence artificielle. Son rôle est de reproduire le raisonnement d&#8217;un expert dans un domaine donné. Le premier système expert se nomme Dendral et permet d&#8217;identifier des constituants chimiques.<br />
Pour réaliser une expertise, il doit proposer des solutions à des problèmes qui lui sont posés. Il fait cela en posant des questions aux utilisateurs et en fonction de leurs réponses, pose de nouvelles questions tout en restant cohérent avec les précédentes jusqu&#8217;à ce qu&#8217;il n&#8217;y ait plus de questions cohérentes à poser et qu&#8217;il ait proposé une solution. Par exemple, dans le système expert nommé Mycin permettant d&#8217;identifier des agents infectieux, une question peut porter sur le type de l&#8217;organisme, et propose deux choix, il est un bâtonnet ou une coque. Si la réponse donnée est bâtonnet, une des questions restant possibles ne pourra pas porter sur des médicaments permettant d&#8217;éradiquer les coques.<a href="http://www.bouleis.fr/public//regles1.xml" title="regles1.xml"></a><br />
Pour fonctionner, un système expert est représenté par les éléments suivants: une base de connaissances constituée d&#8217;une base de faits et d&#8217;une base de règles puis un moteur d&#8217;inférence.</p>
</blockquote>
<p><a href="http://www.bouleis.fr/public//systeme_expert.pdf" title="systeme_expert.pdf">Lire la suite (pdf)</a><br />
<a href="http://www.bouleis.fr/public//faits1.xml" title="faits1.xml">La base de faits en XML<br />
</a><a href="http://www.bouleis.fr/public/regles1.xml" title="regles1.xml">La base de règles en XML</a></p>
<h3>Mise à jour du 29/12/2007</h3>
<p>Ce programme suscitant un peu d&#8217;intérêt, je joins les sources complètes. A défaut d&#8217;une image de Visual Works, je donne le fichier généré lors d&#8217;un &laquo;&nbsp;File out&#8230;&raquo;&nbsp; du package. Ce procédé permet de garantir la compatibilité entre les différents systèmes d&#8217;exploitation.<br />
Afin d&#8217;importer ce fichier, Ouvrir un nouveau &laquo;&nbsp;System browser&raquo;&nbsp; et créer un nouveau package. Puis, dans le menu &laquo;&nbsp;Package&raquo;&nbsp;, choisir &laquo;&nbsp;File into&#8230;&raquo;&nbsp; et selectionner le fichier joint.<br />
Enfin, pour l&#8217;utiliser, voici le code à copier/coller (en remplaçant les chemins de vos fichiers XML) dans un workspace (F6 depuis la fenêtre principale) :</p>
<p> <code><br />
faits := FaitsCollection new.<br />
faits load: '/home/uself/AccessoiresLinux/Developpement/Smalltalk/_Perso/faits.xml'.<br />
regles := ReglesCollection new.<br />
regles load: '/home/uself/AccessoiresLinux/Developpement/Smalltalk/_Perso/regles.xml'.<br />
moteur := Moteur new.<br />
lanceur := LanceurModel new regles: regles ; faits: faits ; moteur: moteur.<br />
LanceurSystemeExpert openWithModel: lanceur.</code></p>
<p>Selectionner le tout, puis un clic droit, &laquo;&nbsp;Do it&raquo;&nbsp; permettra de lancer l&#8217;interface de manière à gérer les règles et les faits ainsi qu&#8217;à lancer le moteur d&#8217;inférence.</p>
<p>Pour rappel, ce programme a été développé sous Visual Works 7.5.</p>
<p><a href="http://www.bouleis.fr/public//systemeexpert.st" title="Sources système expert">Sources système expert</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bouleis.fr/2007/12/20/systeme-expert-en-smalltalk/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Simulation d&#8217;un système de drainage dans une mine</title>
		<link>http://www.bouleis.fr/2007/12/07/simulation-dun-systeme-de-drainage-dans-une-mine/</link>
		<comments>http://www.bouleis.fr/2007/12/07/simulation-dun-systeme-de-drainage-dans-une-mine/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 13:34:21 +0000</pubDate>
		<dc:creator>Romain Bouleis</dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Réseaux]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MPI]]></category>
		<category><![CDATA[Parallélisme]]></category>
		<category><![CDATA[swing]]></category>

		<guid isPermaLink="false">http://www.bouleis.fr/2007/simulation-dun-systeme-de-drainage-dans-une-mine/</guid>
		<description><![CDATA[Simulation d&#8217;un système de drainage dans une mine en C++ et MPI avec une interface en Java

 On s&#8217;intéresse ici à la réalisation d&#8217;un système de commande assurant une fonction de drainage dans une mine. Le but de ce système est de réguler le niveau d&#8217;eau au fond de la mine, par la mise en [...]]]></description>
			<content:encoded><![CDATA[<h3>Simulation d&#8217;un système de drainage dans une mine en C++ et MPI avec une interface en Java</h3>
<blockquote>
<p> On s&#8217;intéresse ici à la réalisation d&#8217;un système de commande assurant une fonction de drainage dans une mine. Le but de ce système est de réguler le niveau d&#8217;eau au fond de la mine, par la mise en route d&#8217;une pompe lorsqu&#8217;un certain seuil (« niveau-eau-haut ») est atteint voir dépassé et ceci jusqu&#8217;à ce qu&#8217;il soit ramené au niveau d&#8217;un autre seuil (« niveau-eau-bas »).<br />
La pompe ne doit toutefois pas fonctionner si les niveau en gaz toxiques présents dans la galerie, méthane et monoxyde de carbone, sont supérieurs à certains seuils (« seuil-CH4 » et « seuil CO »). Un ventilateur permet donc, lorsque cela est nécessaire, d&#8217;évacuer ces gaz vers la surface. On souhaite par ailleurs minimiser l&#8217;utilisation du ventilateur.</p>
<p> <a href="http://www.bouleis.fr/2007/simulation-dun-systeme-de-drainage-dans-une-mine/drainage/" rel="attachment wp-att-24" title="Drainage"><img src="http://www.bouleis.fr/public//drainage.png" alt="Drainage" width="100%" /></a></p>
</blockquote>
<p>Seront utilisés pour modéliser ce système :</p>
<ul>
<li>MPI pour la communication en entre les différents processus (pompe, capteurs, ventilateur&#8230;)</li>
<li>C++ comme langage de développement pour l&#8217;applicatif</li>
<li>Le langage Java avec Swing pour l&#8217;interface graphique</li>
<li>Les threads et les sockets en C++ et en Java pour la communication entre l&#8217;applicatif et l&#8217;interface</li>
</ul>
<p><a href="http://www.bouleis.fr/2007/simulation-dun-systeme-de-drainage-dans-une-mine/rapport-drainage/" rel="attachment wp-att-25" title="Rapport drainage">Le rapport avec les sources en annexe.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bouleis.fr/2007/12/07/simulation-dun-systeme-de-drainage-dans-une-mine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resume file copy with Java</title>
		<link>http://www.bouleis.fr/2007/12/04/resume-file-copy-in-java/</link>
		<comments>http://www.bouleis.fr/2007/12/04/resume-file-copy-in-java/#comments</comments>
		<pubDate>Mon, 03 Dec 2007 23:55:50 +0000</pubDate>
		<dc:creator>Romain Bouleis</dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.bouleis.fr/2007/resume-file-copy-in-java/</guid>
		<description><![CDATA[Reprendre la copie d&#8217;un fichier en Java
 Voici une petite fonction dont le but est de copier un fichier, et le résumer si il existe déjà. Cette solution est très basique, et son implémentation demanderai quelques contrôles supplémentaires comme par exemple s&#8217;assurer que la taille du fichier de destination ne soit pas supérieur à celle [...]]]></description>
			<content:encoded><![CDATA[<h3>Reprendre la copie d&#8217;un fichier en Java</h3>
<p> Voici une petite fonction dont le but est de copier un fichier, et le résumer si il existe déjà. Cette solution est très basique, et son implémentation demanderai quelques contrôles supplémentaires comme par exemple s&#8217;assurer que la taille du fichier de destination ne soit pas supérieur à celle du fichier source. Voici donc cette fonction :</p>
<pre>
<code>
public class FileTransfert {

	public static void resume(File in, File out) throws IOException {
		FileInputStream fis  = new FileInputStream(in);
		FileOutputStream fos = new FileOutputStream(out,true);

		try {
			int i;
			byte[] buf = new byte[1024];
			fis.skip(out.length());
			while ((i = fis.read(buf)) != -1) {
				fos.write(buf,0, i);
				//System.out.println(out.length());
			}
		}
		catch (IOException e) {
			e.printStackTrace();
		}
		finally {
			if (fis != null)  fis.close();
			if (fos != null) fos.close();
		}
	}

	public static void main(String args[]) {
		try {
			resume(new File("/home/rb/test"), new File("/home/rb/test2"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
</code></pre>
<p>Un peu plus sur les transferts de fichiers en Java <a href="http://www.rgagnon.com/javadetails/java-0064.html">ici </a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bouleis.fr/2007/12/04/resume-file-copy-in-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Représentation et transformation des Graphes Conceptuels</title>
		<link>http://www.bouleis.fr/2007/12/02/representation-et-transformation-des-graphes-conceptuels/</link>
		<comments>http://www.bouleis.fr/2007/12/02/representation-et-transformation-des-graphes-conceptuels/#comments</comments>
		<pubDate>Sun, 02 Dec 2007 19:35:22 +0000</pubDate>
		<dc:creator>Romain Bouleis</dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[SVG]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://www.bouleis.fr/2007/representation-et-transformation-des-graphes-conceptuels/</guid>
		<description><![CDATA[
La modélisation de phrases peut être faite à l&#8217;aide de « Graphes Conceptuels ». Ces graphes peuvent eux-mêmes être représentés par un fichier XML associé à une feuille de style XSL  générant une image SVG.
Cette représentation à l&#8217;avantage de séparer les informations liées à la phrase et la mise en forme liée au graphe. [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
<p>La modélisation de phrases peut être faite à l&#8217;aide de « Graphes Conceptuels ». Ces graphes peuvent eux-mêmes être représentés par un fichier XML associé à une feuille de style XSL  générant une image SVG.</p>
<p>Cette représentation à l&#8217;avantage de séparer les informations liées à la phrase et la mise en forme liée au graphe. On pourra ainsi avoir, pour la même phrase, plusieurs représentation possibles.</p>
<p>Le but du travail est de définir une représentation XML des phrases et une mise en forme XSL  afin de pouvoir les afficher sous forme de graphes conceptuels et de prédicats.</p>
<p>Un graphe conceptuel est constitué de relations reliés à des concepts. Une relation peut avoir plusieurs concepts en entrées, mais un seul en sortie. Voici un exemple de graphe conceptuel représentant la phrase « Un étudiant et un professeur se rendent au cours de XML » :</p>
<p><a href="http://www.bouleis.fr/public/graphe.png" title="Graphe"><img src="http://www.bouleis.fr/public/graphe.png" alt="Graphe" /></a></p>
</blockquote>
<p><a href="http://www.bouleis.fr/public/graphes.pdf" title="Rapport graphes">Lire le rapport complet</a><br />
<a href="http://www.bouleis.fr/public/xml_graphes.zip" title="Toutes les sources">Toutes les sources</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bouleis.fr/2007/12/02/representation-et-transformation-des-graphes-conceptuels/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Communication entre Java et C++ grâce aux sockets</title>
		<link>http://www.bouleis.fr/2007/12/02/communication-entre-java-et-c-grace-aux-sockets/</link>
		<comments>http://www.bouleis.fr/2007/12/02/communication-entre-java-et-c-grace-aux-sockets/#comments</comments>
		<pubDate>Sun, 02 Dec 2007 14:06:10 +0000</pubDate>
		<dc:creator>Romain Bouleis</dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Réseaux]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.bouleis.fr/2007/communication-entre-java-et-c-grace-aux-sockets/</guid>
		<description><![CDATA[Lors de la réalisation d&#8217;une application, j&#8217;ai été confronté au problème suivant : faire communiquer Java et C++. Il existe plusieurs moyen pour parvenir à cela :

L&#8217;utilisation des pipes
L&#8217;utilisation d&#8217;un fichier commun
L&#8217;utilisation des stdin et stdout
L&#8217;utilisation d&#8217;une solution réseau : corba, socket&#8230;

C&#8217;est cette dernière solution que j&#8217;ai choisi et dont ce billet va traiter.
Lors de [...]]]></description>
			<content:encoded><![CDATA[<p>Lors de la réalisation d&#8217;une application, j&#8217;ai été confronté au problème suivant : faire communiquer Java et C++. Il existe plusieurs moyen pour parvenir à cela :</p>
<ul>
<li>L&#8217;utilisation des pipes</li>
<li>L&#8217;utilisation d&#8217;un fichier commun</li>
<li>L&#8217;utilisation des stdin et stdout</li>
<li>L&#8217;utilisation d&#8217;une solution réseau : corba, socket&#8230;</li>
</ul>
<p>C&#8217;est cette dernière solution que j&#8217;ai choisi et dont ce billet va traiter.</p>
<p>Lors de ce type de communication, il faut nécessairement un serveur et un client. Le serveur devra être exécuté avant le client qui s&#8217;y connectera. Une fois la connexion établie, il n&#8217;y a plus de différences entre le client et le serveur, les deux attendront un éventuel message, et les deux seront prêt à en émettre.</p>
<p>Pour pouvoir se faire (être prêt à émettre et à recevoir en même temps), le client et le serveur devront être multithread, un thread sera chargé d&#8217;attendre un message et un autre d&#8217;en envoyer.</p>
<p>Dans cet exemple, l&#8217;application Java aura le rôle de serveur, et application C++ aura le rôle de client. Si vous comprenez bien le mécanisme, vous n&#8217;aurez pas de mal à les intervertir.</p>
<p>Tout d&#8217;abord, intéressons nous au serveur (Serveur.java)</p>
<p>Pour faire un Thread en Java, une méthode consiste à faire une classe qui étend de &laquo;&nbsp;Thread&raquo;&nbsp; et qui redéfinit la méthode &laquo;&nbsp;run&raquo;&nbsp;. Le contenu de cette méthode sera celui exécuté par le thread. Dans notre cas, cette méthode devra attendre qu&#8217;un client se connecte puis attendra un éventuel message :</p>
<pre>
<code>
/**
 *
 * @author Romain Bouleis www.bouleis.fr
 *
 */
public class Server extends Thread{
	private int port;
	private boolean run = true;
	private PrintWriter out;
	private BufferedReader in;
	public Server(int port) {
		this.port = port;
	}
	/**
	 * {@docRoot} start the server
	 */
	public void run() {
		ServerSocket server;
		Socket client;
		try {
			//crée un nouveau socket
			server = new java.net.ServerSocket (this.port);
			//attend un client
			client  = server.accept();
			System.out.println("[Server] client connected");
			//writer sur le socket
			out = new PrintWriter(client.getOutputStream(), true);
			//reader sur le soket
			in  = new BufferedReader (new InputStreamReader(client.getInputStream()));
			String msg = "";
			//tant que le serveur est actif et que le client est connecte
			while(this.run &amp;&amp; msg != null) {
				//attend un message
				msg = in.readLine();
				//traiter le message
				System.out.println("[server] message reçu : "+msg);
				//arete le serveur si le message est "exit"
				if("exit".equals(msg)) this.run = false;
			}
			//ferme le reader et le writer
			out.close();
			in.close();
			//ferme le socket
			client.close();
			server.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String args[]) {
		Server s = new Server(8000);
		s.start();
	}
}
</code></pre>
<p> Ce code executera un serveur attendant un client sur le port 8000. Pour pouvoir envoyer un message à un éventuel client, il faut rajouter une méthode :</p>
<pre>
<code>
public void sendCommand(String c) {
	if(out != null) out.println(c);
	else System.err.println("no client");
}

public static void main(String args[]) {
	Server s = new Server(8000);
	s.start();
	//attendre la connexion d'un client
	s.sendCommand("envoie de cette ligne au client");
}
</code></pre>
<p> On peut tester le serveur grâce à telnet : telnet localhost 8000. Lors d&#8217;envoie de messages, ils devraient s&#8217;afficher dans la console depuis laquelle le serveur a été lancé.</p>
<p> Intéressons nous maintenant au client. De la même façon, un thread sera crée pour attendre des messages du serveur.</p>
<pre>
<code>
#define SOCKET_PORT 8000

using namespace std;

int socketDescriptor;

Client::Client() { }

//se connecte au serveur
void Client::init(char* socket_host) {
	struct sockaddr_in serverAddress;
	struct hostent *hostInfo;

	cout &lt;&lt; "[Client] connecting..." &lt;&lt;
	//Choix de l'hôte
  	hostInfo = gethostbyname(socket_host);
 	if (hostInfo == NULL) {
    	cout &lt;&lt; "[Client] problem interpreting host: " &lt;&lt;
		exit(1);
 	}

	// Creation du socket.
  	socketDescriptor = socket(PF_INET, SOCK_STREAM, 0);
  	if (socketDescriptor &lt; 0) {
   		cerr &lt;&lt; "[Client] cannot create socket\n";
    	exit(1);
  	}

	serverAddress.sin_family = hostInfo-&gt;h_addrtype;
  	memcpy((char *) &amp;serverAddress.sin_addr.s_addr,
    hostInfo-&gt;h_addr_list[0], hostInfo-&gt;h_length);
  	serverAddress.sin_port = htons(SOCKET_PORT);
 	memset(serverAddress.sin_zero, '\0', sizeof serverAddress.sin_zero);

	connect(socketDescriptor, (struct sockaddr *)&amp;serverAddress, sizeof(serverAddress));

	cout &lt;&lt; "[Client] connected to server" &lt;&lt;
}

//cree un thread executant la methode runWaitMessage
pthread_t Client::runWaitMessageThread() {
	pthread_t attente;
	(void) pthread_create(&amp;attente, NULL, Client::runWaitMessage, (void*) &amp;socketDescriptor);
	return attente;
}

//attends des messages
void * Client::runWaitMessage(void * args) {
	cout &lt;&lt; "[Client] Waiting messages thread running..." &lt;
	char line[255];
	memset(line, '\0', sizeof(line));
	while(recv(socketDescriptor, line, sizeof(line), 0) &gt; 1) {
		//remove the \n at the end of the string
		unsigned int i=0;
		char line_[strlen(line)-1];
		for(i=0;i&lt;strlen(line);i++)
			line_[i] = line[i];
		}
		line_[i] = '\0';
		cout &lt;&lt; "[Client] " &lt;&lt; line_ &lt;&lt; " received" &lt;&lt;

		//on traite le message

		memset(line, '\0', sizeof(line));
	}
	return (void *) 1;
}

//send a command
void Client::sendCommande(string s) {
	char * message;
	string s_ = s;
	s += "\r\n";
	message = (char *) s.c_str();
	send(socketDescriptor,message,strlen(message),0);
	cout &lt;&lt; "[Client] " &lt;&lt; s_ &lt;&lt; " sent" &lt;
}

//close the socket
void Client::closeClient() {
	close(socketDescriptor);
	cout &lt;&lt; "[Client] disconnected" &lt;&lt;
}
</code></pre>
<p>Enfin, on peut lancer le client avec la méthode suivante :</p>
<pre>
<code>
int main(int argc, char* argv[]) {
	Client *client = new Client();
	client-&gt;init("localhost");
	client-&gt;runWaitMessageThread();
	client-&gt;sendCommande(message);
}
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bouleis.fr/2007/12/02/communication-entre-java-et-c-grace-aux-sockets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

