{"id":300,"date":"2013-06-19T00:05:24","date_gmt":"2013-06-18T23:05:24","guid":{"rendered":"http:\/\/chezdom.net\/etu\/?p=300"},"modified":"2013-06-23T16:02:33","modified_gmt":"2013-06-23T15:02:33","slug":"tp-19-juin-2012-sockets","status":"publish","type":"post","link":"https:\/\/chezdom.net\/etu\/2013\/06\/19\/tp-19-juin-2012-sockets\/","title":{"rendered":"TP 2 &#8211; Sockets"},"content":{"rendered":"<h2>Exercice 1<\/h2>\n<p>On cherche \u00e0 cr\u00e9er un serveur de date. C&rsquo;est probablement le type de serveur le plus simple qui soit.<\/p>\n<p>1. Cr\u00e9er une classe DateServer, qui ouvre un ServerSocket pour \u00e9couter un port donn\u00e9, et r\u00e9pond \u00ab\u00a0TOUCH\u00c9\u00a0\u00bb lorsqu&rsquo;elle re\u00e7oit une connexion sur ce port.<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1; highlight: []; html-script: false\">import java.io.IOException;\r\nimport java.net.ServerSocket;\r\nimport java.net.Socket;\r\n\r\npublic class DateServer01 {\r\n\tprivate static int PORT = 9090;\r\n\t\r\n\tpublic static void main (String args[]) {\r\n\t\tServerSocket listener=null;\r\n\t\tSocket socket;\r\n\t\ttry {\r\n\t\t\tlistener=new ServerSocket(PORT);\r\n\t\t\tSystem.out.println(&quot;Serveur en attente sur le port &quot;+PORT);\r\n\t\t\twhile (true) {\r\n\t\t\t\tsocket=listener.accept();\r\n\t\t\t\tSystem.out.println(&quot;Recu une connection sur le port &quot;+PORT);\r\n\t\t\t\tsocket.close();\r\n\t\t\t}\r\n\t\t} catch (IOException e) {\r\n\t\t\tSystem.err.println(&quot;Impossible d&#039;\u00e9couter le port &quot;+PORT);\r\n\t\t}\r\n\t\tSystem.out.println(&quot;Fin de programme&quot;);\r\n\t}\r\n}\r\n<\/pre>\n<p>2. Tester ce serveur avec Telnet.<\/p>\n<p>3. Une fois la connexion \u00e9tablie envoyer la date sur le socket. Puis tester de nouveau avec Telnet. De m\u00eame essayez de tester les serveurs de vos camarades.<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1; highlight: []; html-script: false\">import java.io.IOException;\r\nimport java.io.PrintStream;\r\nimport java.net.ServerSocket;\r\nimport java.net.Socket;\r\nimport java.util.Date;\r\n\r\npublic class DateServer02 {\r\n\tprivate static int PORT = 9090;\r\n\t\r\n\tpublic static void main (String args[]) {\r\n\t\tServerSocket listener=null;\r\n\t\tSocket socket;\r\n\t\ttry {\r\n\t\t\tlistener=new ServerSocket(PORT);\r\n\t\t\tSystem.out.println(&quot;Serveur en attente sur le port &quot;+PORT);\r\n\t\t\twhile (true) {\r\n\t\t\t\tsocket=listener.accept();\r\n\t\t\t\tSystem.out.println(&quot;Recu une connection sur le port &quot;+PORT);\r\n\t\t\t\t\r\n\t\t\t\tPrintStream out=new PrintStream(socket.getOutputStream());\r\n\t\t\t\tout.println(&quot;La date est : &quot;+(new Date()));\t\t\t\t\r\n\t\t\t\tout.close();\r\n\t\t\t\t\r\n\t\t\t\tsocket.close();\r\n\t\t\t}\r\n\t\t} catch (IOException e) {\r\n\t\t\tSystem.err.println(&quot;Impossible d&#039;\u00e9couter le port &quot;+PORT);\r\n\t\t}\r\n\t\tSystem.out.println(&quot;Fin de programme&quot;);\r\n\t}\r\n}\r\n<\/pre>\n<p>4. Impl\u00e9menter un client capable d&rsquo;aller lire une heure sur ce serveur et de l&rsquo;afficher (en ligne de commande).<\/p>\n<pre class=\"brush: java; gutter: true; first-line: 1; highlight: []; html-script: false\">import java.io.BufferedReader;\r\nimport java.io.IOException;\r\nimport java.io.InputStreamReader;\r\nimport java.net.Socket;\r\nimport java.net.UnknownHostException;\r\n\r\npublic class DateClient {\r\n\tprivate static int PORT = 9090;\r\n\tprivate static String SERVER = &quot;localhost&quot;;\r\n\t\r\n\tpublic static void main (String args[]) {\r\n\t\tSocket socket;\r\n\t\ttry {\r\n\t\t\tsocket=new Socket(SERVER,PORT);\r\n\r\n\t\t\tBufferedReader input=new BufferedReader(\r\n\t\t\t\t\tnew InputStreamReader(socket.getInputStream()));\r\n\r\n\t\t\tString answer=input.readLine();\r\n\t\t\tSystem.out.println(&quot;Le serveur a dit : &quot;+answer);\r\n\r\n\t\t\tinput.close();\r\n\t\t\tsocket.close();\r\n\t\t} catch (UnknownHostException e) {\r\n\t\t\t\/\/ TODO Auto-generated catch block\r\n\t\t\te.printStackTrace();\r\n\t\t} catch (IOException e) {\r\n\t\t\t\/\/ TODO Auto-generated catch block\r\n\t\t\te.printStackTrace();\r\n\t\t}\r\n\t}\r\n\t\r\n}\r\n<\/pre>\n<p>5. Impl\u00e9mentez une petite application cliente SWING, qui affiche l&rsquo;heure lue sur le serveur, avec un bouton de mise \u00e0 jour. Deux champs de texte permettront de donner l&rsquo;adresse du serveur et son port.<\/p>\n<h2>Exercice 2<\/h2>\n<p>Il s&rsquo;agit de r\u00e9aliser un programme permettant de jouer au \u00ab\u00a0Morpion\u00a0\u00bb \u00e0 2 joueurs via le r\u00e9seau. On consid\u00e8re le jeu standard du morpion \u00e0 9 cases, dans lequel chaque jouer essaye de r\u00e9aliser une ligne, horizontale, verticale ou en diagonale.<\/p>\n<p>Le principe est de construire 2 applications : d&rsquo;une part un serveur dont le r\u00f4le est d&rsquo;attendre les connexions des joueurs, puis de les faire jouer ensemble, et d&rsquo;autre part une application SWING qui affiche sur la machine de\u00a0chaque joueur l&rsquo;\u00e9tat du jeu et lui permet de jouer lorsque c&rsquo;est son tour.<\/p>\n<p>1. Quelles sont les t\u00e2ches qui doivent \u00eatre impl\u00e9ment\u00e9e au niveau du serveur ? des clients ?<\/p>\n<p>2. Une m\u00e9thode \u00e9l\u00e9gante consiste \u00e0 commencer par d\u00e9crire un protocole de communication (qu&rsquo;on pourrait appeler OMCP pour Online Morpion Communication Protocol). Proposer un tel protocole.<\/p>\n<pre class=\"brush: text; gutter: false; first-line: 1; highlight: []; html-script: false\">Protocole OMCP \/\/ Online Morpion Communication Protocol :-)\r\nS\u00e9parateur : EOL\r\n\r\nClient -&gt; Serveur\r\nOMCP \/\/ shake hands\r\nNAME [A-Za-z0-9] \/\/ Envoi du nom du joueur\r\nPLAY [0-8] \/\/ Joue la case n\r\nCANCEL \/\/ Le joueur abandonne\r\n\r\nServeur -&gt; Client\r\nWELCOME [XO] \/\/ Connection accept\u00e9e et attribution de la marque du joueur\r\nFULL \/\/ Connection refus\u00e9e, il y a d\u00e9j\u00e0 2 joueurs\r\nERROR \/\/ Connection refus\u00e9e, protocole incorrect (pas re\u00e7u OMCP)\r\nOTHERNAME \/\/ Envoie le nom de l&#039;autre joueur\r\nHAND \/\/ Donne la main \u00e0 un joueur\r\nVALID \/\/ Le coup jou\u00e9 est valide\r\nWRONG \/\/ Le coup jou\u00e9 est impossible\r\nOTHERPLAY [0-8] \/\/ L&#039;autre joueur a jou\u00e9 en case n\r\nWIN \/\/ Le joueur \u00e0 gagn\u00e9\r\nLOST \/\/ Le joueur \u00e0 perdu\r\nTIE \/\/ Match nul\r\nOTHERCANCEL \/\/ L&#039;autre joueur a abandonn\u00e9 ou sa connection a \u00e9t\u00e9 perdue\r\n<\/pre>\n<p>3. Voici la partie <a href=\"http:\/\/chezdom.net\/etu\/2013\/06\/22\/online-morpion-serveur\/\" title=\"Online Morpion serveur\">serveur<\/a>. A vous d&rsquo;impl\u00e9menter le client SWING.<\/p>\n<p>4. Les joueurs aimeraient bien pouvoir communiquer par chat en m\u00eame temps. Qu&rsquo;est-ce que cela implique ?<\/p>\n<p>5. On voudrait que plusieurs joueurs puissent se connecter en m\u00eame temps, et se lancer des d\u00e9fis. Le serveur devrait pouvoir g\u00e9rer plusieurs parties en m\u00eame temps. Quelles seront les modifications \u00e0 apporter ?<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Exercice 1 On cherche \u00e0 cr\u00e9er un serveur de date. C&rsquo;est probablement le type de serveur le plus simple qui soit. 1. Cr\u00e9er une classe DateServer, qui ouvre un ServerSocket pour \u00e9couter un port donn\u00e9, et r\u00e9pond \u00ab\u00a0TOUCH\u00c9\u00a0\u00bb lorsqu&rsquo;elle re\u00e7oit<span class=\"ellipsis\">&hellip;<\/span> <span class=\"read-more\"><a href=\"https:\/\/chezdom.net\/etu\/2013\/06\/19\/tp-19-juin-2012-sockets\/\">Lire la suite &#8250;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[10],"tags":[],"class_list":["post-300","post","type-post","status-publish","format-standard","hentry","category-nouakchott"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9qu1A-4Q","_links":{"self":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/posts\/300","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/comments?post=300"}],"version-history":[{"count":11,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/posts\/300\/revisions"}],"predecessor-version":[{"id":334,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/posts\/300\/revisions\/334"}],"wp:attachment":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/media?parent=300"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/categories?post=300"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/tags?post=300"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}