From 83fb38c2f10077509f991600f72477bdaae52cc6 Mon Sep 17 00:00:00 2001 From: Sarah CHERCHEM <ls_cherchem@esi.dz> Date: Sun, 16 Mar 2025 15:07:44 +0100 Subject: [PATCH] creation d'un ServerNIO --- .idea/.gitignore | 3 + .idea/gradle.xml | 19 ++ .idea/jarRepositories.xml | 20 ++ .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/reseaux_select.iml | 9 + .idea/vcs.xml | 6 + mesures.csv | 8 + mesures_latence.csv | 15 + src/.gradle/7.5.1/checksums/checksums.lock | Bin 0 -> 17 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.bin | Bin 0 -> 32334 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes src/.gradle/7.5.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes src/.gradle/7.5.1/fileHashes/fileHashes.bin | Bin 0 -> 20047 bytes src/.gradle/7.5.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../7.5.1/fileHashes/resourceHashesCache.bin | Bin 0 -> 20027 bytes src/.gradle/7.5.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 19019 bytes src/.gradle/file-system.probe | Bin 0 -> 8 bytes src/.gradle/vcs-1/gc.properties | 0 src/build.gradle | 19 ++ src/build/classes/java/main/Client.class | Bin 0 -> 4986 bytes src/build/classes/java/main/ClientNIO.class | Bin 0 -> 5052 bytes src/build/classes/java/main/Code.class | Bin 0 -> 2636 bytes src/build/classes/java/main/IdleClient.class | Bin 0 -> 2630 bytes .../java/main/ManualMastermindClient.class | Bin 0 -> 3237 bytes .../java/main/MastermindBotClient.class | Bin 0 -> 3591 bytes .../main/MastermindServer$GameSession.class | Bin 0 -> 3157 bytes .../classes/java/main/MastermindServer.class | Bin 0 -> 7286 bytes .../java/main/ServerNIO$ClientData.class | Bin 0 -> 841 bytes .../java/main/ServerNIO$GameSession.class | Bin 0 -> 2467 bytes .../java/main/ServerNIO$PlayerScore.class | Bin 0 -> 1190 bytes src/build/classes/java/main/ServerNIO.class | Bin 0 -> 9044 bytes src/build/classes/java/main/Stress1.class | Bin 0 -> 6827 bytes .../compileJava/previous-compilation-data.bin | Bin 0 -> 650 bytes src/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 60756 bytes src/gradle/wrapper/gradle-wrapper.properties | 5 + src/gradlew | 240 +++++++++++++++ src/gradlew.bat | 91 ++++++ src/settings.gradle | 2 + src/src/main/java/Client.java | 123 ++++++++ src/src/main/java/ClientNIO.java | 127 ++++++++ src/src/main/java/Code.java | 80 +++++ src/src/main/java/IdleClient.java | 31 ++ src/src/main/java/ManualMastermindClient.java | 50 ++++ src/src/main/java/MastermindBotClient.java | 60 ++++ src/src/main/java/MastermindServer.java | 178 +++++++++++ src/src/main/java/ServerNIO.java | 277 ++++++++++++++++++ src/src/main/java/Stress1.java | 86 ++++++ 53 files changed, 1466 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/reseaux_select.iml create mode 100644 .idea/vcs.xml create mode 100644 mesures.csv create mode 100644 mesures_latence.csv create mode 100644 src/.gradle/7.5.1/checksums/checksums.lock create mode 100644 src/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock create mode 100644 src/.gradle/7.5.1/dependencies-accessors/gc.properties create mode 100644 src/.gradle/7.5.1/executionHistory/executionHistory.bin create mode 100644 src/.gradle/7.5.1/executionHistory/executionHistory.lock create mode 100644 src/.gradle/7.5.1/fileChanges/last-build.bin create mode 100644 src/.gradle/7.5.1/fileHashes/fileHashes.bin create mode 100644 src/.gradle/7.5.1/fileHashes/fileHashes.lock create mode 100644 src/.gradle/7.5.1/fileHashes/resourceHashesCache.bin create mode 100644 src/.gradle/7.5.1/gc.properties create mode 100644 src/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 src/.gradle/buildOutputCleanup/cache.properties create mode 100644 src/.gradle/buildOutputCleanup/outputFiles.bin create mode 100644 src/.gradle/file-system.probe create mode 100644 src/.gradle/vcs-1/gc.properties create mode 100644 src/build.gradle create mode 100644 src/build/classes/java/main/Client.class create mode 100644 src/build/classes/java/main/ClientNIO.class create mode 100644 src/build/classes/java/main/Code.class create mode 100644 src/build/classes/java/main/IdleClient.class create mode 100644 src/build/classes/java/main/ManualMastermindClient.class create mode 100644 src/build/classes/java/main/MastermindBotClient.class create mode 100644 src/build/classes/java/main/MastermindServer$GameSession.class create mode 100644 src/build/classes/java/main/MastermindServer.class create mode 100644 src/build/classes/java/main/ServerNIO$ClientData.class create mode 100644 src/build/classes/java/main/ServerNIO$GameSession.class create mode 100644 src/build/classes/java/main/ServerNIO$PlayerScore.class create mode 100644 src/build/classes/java/main/ServerNIO.class create mode 100644 src/build/classes/java/main/Stress1.class create mode 100644 src/build/tmp/compileJava/previous-compilation-data.bin create mode 100644 src/gradle/wrapper/gradle-wrapper.jar create mode 100644 src/gradle/wrapper/gradle-wrapper.properties create mode 100644 src/gradlew create mode 100644 src/gradlew.bat create mode 100644 src/settings.gradle create mode 100644 src/src/main/java/Client.java create mode 100644 src/src/main/java/ClientNIO.java create mode 100644 src/src/main/java/Code.java create mode 100644 src/src/main/java/IdleClient.java create mode 100644 src/src/main/java/ManualMastermindClient.java create mode 100644 src/src/main/java/MastermindBotClient.java create mode 100644 src/src/main/java/MastermindServer.java create mode 100644 src/src/main/java/ServerNIO.java create mode 100644 src/src/main/java/Stress1.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..af8db0b --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="GradleMigrationSettings" migrationVersion="1" /> + <component name="GradleSettings"> + <option name="linkedExternalProjectsSettings"> + <GradleProjectSettings> + <option name="distributionType" value="DEFAULT_WRAPPED" /> + <option name="externalProjectPath" value="$PROJECT_DIR$/src" /> + <option name="gradleHome" value="$PROJECT_DIR$/../../../../../../gradle/gradle-8.0" /> + <option name="gradleJvm" value="18" /> + <option name="modules"> + <set> + <option value="$PROJECT_DIR$/src" /> + </set> + </option> + </GradleProjectSettings> + </option> + </component> +</project> \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="RemoteRepositoriesConfiguration"> + <remote-repository> + <option name="id" value="central" /> + <option name="name" value="Maven Central repository" /> + <option name="url" value="https://repo1.maven.org/maven2" /> + </remote-repository> + <remote-repository> + <option name="id" value="jboss.community" /> + <option name="name" value="JBoss Community repository" /> + <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" /> + </remote-repository> + <remote-repository> + <option name="id" value="MavenRepo" /> + <option name="name" value="MavenRepo" /> + <option name="url" value="https://repo.maven.apache.org/maven2/" /> + </remote-repository> + </component> +</project> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..ade1ecd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ExternalStorageConfigurationManager" enabled="true" /> + <component name="ProjectRootManager"> + <output url="file://$PROJECT_DIR$/out" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..8def1d0 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/reseaux_select.iml" filepath="$PROJECT_DIR$/.idea/reseaux_select.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/.idea/reseaux_select.iml b/.idea/reseaux_select.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/reseaux_select.iml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="JAVA_MODULE" version="4"> + <component name="NewModuleRootManager" inherit-compiler-output="true"> + <exclude-output /> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="" vcs="Git" /> + </component> +</project> \ No newline at end of file diff --git a/mesures.csv b/mesures.csv new file mode 100644 index 0000000..e2496d3 --- /dev/null +++ b/mesures.csv @@ -0,0 +1,8 @@ +Nombre_de_clients;Temps_moyen_ns;Min_Temps_ns;Max_Temps_ns;Ecart_Type_ns +1;30307300;30307300;30307300;0.0 +2;1401350;1325500;1477200;75850.0 +10;2543170;1373500;3592300;731917.0131237557 +100;10871037;1274900;20403400;5914776.77157806 +1000;5834602;1502200;42603600;2.111329554489539E7 +5000;3072008;922400;61310800;1.8383644560914222E7 +50000;3682380;462800;142229600;2.6974526829630088E7 diff --git a/mesures_latence.csv b/mesures_latence.csv new file mode 100644 index 0000000..4b5905e --- /dev/null +++ b/mesures_latence.csv @@ -0,0 +1,15 @@ +Nombre_de_clients;Temps_moyen_ns;Min_Temps_ns;Max_Temps_ns;Ecart_Type_ns +1;30529600;30529600;30529600;0.0 +2;1040150;928100;1152200;112050.0 +10;2699440;1299400;4103500;928589.5004790869 +100;13855409;1352500;25882300;6976373.27770769 +1000;8356150;1198400;128064800;2.996718981788606E7 +5000;7360120;525100;307029900;7.823948724830812E7 +50000;4634118;436500;306068000;3.703753723305639E7 +1;30111900;30111900;30111900;0.0 +2;1189550;1066700;1312400;122850.0 +10;2521170;1196100;3792200;871711.3020375496 +100;12193571;1271800;21247200;6169356.7433728855 +1000;8795728;1140800;117457600;4.482277478589943E7 +5000;4288497;719400;81092900;3.360717128906339E7 +50000;4160538;428900;253224200;3.6309229373730935E7 diff --git a/src/.gradle/7.5.1/checksums/checksums.lock b/src/.gradle/7.5.1/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..55bcaa48ff0cb762db01892b7a39c2dc7af64b16 GIT binary patch literal 17 TcmZQ({FlP~S9Zrg1}FdkG7bbf literal 0 HcmV?d00001 diff --git a/src/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock b/src/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..b73662c4ed62341f8eeff33f41db27f3be797a4d GIT binary patch literal 17 TcmZQx9;R}X+w5I20~7!NE93)= literal 0 HcmV?d00001 diff --git a/src/.gradle/7.5.1/dependencies-accessors/gc.properties b/src/.gradle/7.5.1/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/src/.gradle/7.5.1/executionHistory/executionHistory.bin b/src/.gradle/7.5.1/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..0904beb5cb2322a96d69b6b217799f0344cefaff GIT binary patch literal 32334 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 literal 0 HcmV?d00001 diff --git a/src/.gradle/7.5.1/executionHistory/executionHistory.lock b/src/.gradle/7.5.1/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..7acb799609dee6892559eb03e8f652d65b257492 GIT binary patch literal 17 VcmZQx*SCs+Z4*lh0~jz`0sttN14IA- literal 0 HcmV?d00001 diff --git a/src/.gradle/7.5.1/fileChanges/last-build.bin b/src/.gradle/7.5.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/src/.gradle/7.5.1/fileHashes/fileHashes.bin b/src/.gradle/7.5.1/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..fb8f243d87a0bdbc0b99f5996395af53a182b19d GIT binary patch literal 20047 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 B7zY3V literal 0 HcmV?d00001 diff --git a/src/.gradle/7.5.1/fileHashes/fileHashes.lock b/src/.gradle/7.5.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..cb2bf5e224b335c6a71e098fec2227c7a981fa49 GIT binary patch literal 17 VcmZSHv+1(;7uLWk1~6c}2LL(71v3Bu literal 0 HcmV?d00001 diff --git a/src/.gradle/7.5.1/fileHashes/resourceHashesCache.bin b/src/.gradle/7.5.1/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..e34e28faf138c5f1364374a484d387786aa9baca GIT binary patch literal 20027 zcmZ=^V2}{_4+RVeAc|m)vPMH-Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nhD!*9GB7Z3K|CX&!vtdRmoqRJ@Gvki=r&}9l>ASg zp9K<SVDPesP9OYlm>S{wd&`Uvh`7&Un0V8K_?wJjT(cnJzWFfm4x3|J44sbGLBzd| z!^In;1m|sEEdvqv41|ey^8Y)qZfVF8h`7gcn0WWh%O4JTSZYDUeK*6z`?dY0d9>%~ zK*YUuVd9fGS7-Pht6T*U_i%)XPmcEs`?>K3KSbQ;C`^3XnX_6;IsZyS#Jv(>;?t+E z%-hhh?hQoTrx7MTtAO{_!@ind5OI%WnD`PdekrzDiIGt8R+#we_VtT4$X~LDh<h!C ziLal|$JSRl?<+*yPZB1+p;vwXmC1a<5OH5$xcIH*>s;SA9)OB}hly`YNIoL*=#Do; z-0LMweEVDPZ+p96!qi`diSOOK*KA$r3O$H=Z*G|Qxt4&7E7@jcK*T+ZVd4)iIee99 zd*J{T*N2HeeK~dI!5!8oAmZMIF!6W4Ok1ALI_Ciq_tl1p|G2PF>HvqxOo+ITG)$aD zeWH7*<Mwcfxc63=IG5K+|2l=g(0KH`2@@CkrX?kQap_}-de7f5aft<HlK<|=e}jti z!o+1(m#1%f)e{C0_r4AjSHB^f^3f*mCq&#!7ACH38UH0w?LAc7`zK7??6%BK)9(uZ zAnHB0!^AC8n!mIJsu)1TeQaUkZkNP!lEQXE)0OW;n7I3FE727<^(I5qd%T8;hg_I` z;>64Sk09bc@i6gdX3<l1AH-qd;|~`PZ~l1K@{lJ)y)P$BJZ1A7Zr7)}jSz94=P>as zX71;WOSjH}h<lubi5E6Rvb=t5yayugITa>ec0R+WB*x4QBJMpICSGH;({9}_j^hw< zuV$DyjAme9fw~EzVw4;Wfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc44PY4(@Ffd3mFfa&$u)zBw>Elk?i6?^{VxCq#c-_Llz#xaJ z;@;P*Nomt_EDi1Rx${edKx?$oR1{ATU8CcFR+zQZ?M3p2pP*IEXezk%g>PwImakzp zJEtH$=j0?zTXfy6s+87;7ut9v&nfYa0Ig(4Gh^xu(^naf%=)_)zBiZNwdNwG887p; z6kphVg)2Vf_mf8{XF4%eh&EcjFxHAYTJE*<LBG+TyO=6OHg+CSWmBqKC-5v#J%5iW zrizA`oSVnaEVGE;R=zOp-d{UR6?LBy4<9^vGk!Mnx@%`H=PF^UNPft?`BuS_g#70p zmz|S3nvAI;yKBYr;5iDn_%2^hPxZ*Xjj3Yp^2N2YXC9t(L`6N}{@D;qOcfIa^1D6n zUf-+z#$c&Is6q^;ijOt!rxvUa4G24WDs`ftr5UD*b2lF)$A(BAG}(Q&rNcn^Bc=*v zzNd-W-Sv}89vVzgS>kgBQ$?%9C&~Sdt^sF-7{2Lmb?(Jfp_H;p`P+x@I-9QhZW8{? zqm8NJqH_4;jh9aw)iMb$TwlKpblMeK`q2Fy*k9!TBmVeiqw5#AwSQxpaXIkOlusPK z3ksjl2)1AU2(*g@&5S2&ZfKfWPMRyCr26=Sa`0(PGlC~<SIO*5a250WdMR0A;WSJY zFF5lLlm`4a=MP=-!ob`QODc>DYWpocBZVdD{G7e@)zh%#C?);nm(K{ZeBBXimF>TS zkq6V3E!s5?we#%+U%k5e^6}(a(2f=~znt(_nppIMQ)5b!_a}3mYYCWU7-_L|uyIIu z_Pv|+k2fjnDy9lgjs<1SYae`k6RDNHG*t++KL*W~xWK2f8tHN6cSQEDUh&c&RCJ)J zSi*5_fkR&%$Mm+{VQTiwD=}>mbY7tFlg*0h(hqTtV*MV_t{OBm%8s6Xv0q-fMD_RL zge}e=Z7|KKd8wHrmwEA8dGXO%lHYdS#8mN`*C+M8M2*~rJ-yqnr1^vPB%#@o8h7R+ z)14#NlP(CQF_>64VVdC=vTRz`PNSlQVm_HJA$u7yRm{tu8(r!c5WdyMI{)6L^?NZ@ z%)D5AZIAWtmn*F8<U`Bd<uFy;kH2wH>*OMqrE4Djid`23+D(M!QoXxO7f&gj6uNpN fvfXsIFBV(!g#s=5CTw}IMS8x|(Tz(^fouT)ZaUG} literal 0 HcmV?d00001 diff --git a/src/.gradle/7.5.1/gc.properties b/src/.gradle/7.5.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/src/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/src/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..4dff135a3f27ce7ade9b079de84096b8d5f575d0 GIT binary patch literal 17 VcmZP$2z%To{pi>v1~6bW0{}Jt1g8K1 literal 0 HcmV?d00001 diff --git a/src/.gradle/buildOutputCleanup/cache.properties b/src/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..3f371e2 --- /dev/null +++ b/src/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Thu Mar 13 13:52:33 CET 2025 +gradle.version=7.5.1 diff --git a/src/.gradle/buildOutputCleanup/outputFiles.bin b/src/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..178cf6fa340ea6028998b743f748e0d069c058ae GIT binary patch literal 19019 zcmZ=^V2}{_4+RVeAc|m)vPMH-Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nhD!*9GB7Z3K|CX&!vtdRmoqRJ@Gvki$o8xeKO$)t zzy}g#VDPksP9OZA+&L}Va-NPoMBK{~CO%c`nB2zcN1@^#k744oosC`hasB=UQSaFb z6JK#QjDPaOh)$@uKTLe%!l0R#wyt>t5%(yEiEr+jsh{cgx*a0!c^@XeHQRKz_*qS5 zsJJ9d{L=p#-UaecCPTzMI$`4XE`R@#7QlZGBJL#$6Mq&fb8@;>z<!9h=Wdwz$AxJ< ze{}e_L&b|>;$M?a>fKp-M-wW37ADRu^+;&#%A8V&xW|5&IPct)n>?%EzJ`c<Cc?x8 z)-rx(t(?6QD$WiQ7ks*-Kt}ySIaFL5Ca%H0|A6x;JE-}dD`DcATZB&6t!Zt5sP~u+ z6StnFqtFoGxCtu$6(;V?w}P|LbN*q7xEC`_+|BQ4#Tk+5-=N~^Fma!Ng%R_g8QDO@ zJ=Vg+{k?vNEU9Yz2Ne&7iN{I_PcSXG_#Gnd`4J|b#<e+k@9S+)dp#Us;#q9$Q}oaL zd;wAKkqQ$pI?b_u-<R+5Q1Oc}@#+^-dz|-O{R|QJoDLI*(F_bsCn0j9<Y)+thQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjGPcK tW?*38WME)m1Yr=thav(Bh`}U6o(nN`5hFsL-!V-l&m2r$<e5ygE&xxrjj;d# literal 0 HcmV?d00001 diff --git a/src/.gradle/file-system.probe b/src/.gradle/file-system.probe new file mode 100644 index 0000000000000000000000000000000000000000..b6b652ca263cb99b402843235f968d7f670682d1 GIT binary patch literal 8 PcmZQzV4ONZ^xtm)2yFv3 literal 0 HcmV?d00001 diff --git a/src/.gradle/vcs-1/gc.properties b/src/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/src/build.gradle b/src/build.gradle new file mode 100644 index 0000000..3cae2d7 --- /dev/null +++ b/src/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'org.example' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/src/build/classes/java/main/Client.class b/src/build/classes/java/main/Client.class new file mode 100644 index 0000000000000000000000000000000000000000..bf7bf00e0ef39728bbc74f6b380ebd8d3c8c0ebc GIT binary patch literal 4986 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 literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/ClientNIO.class b/src/build/classes/java/main/ClientNIO.class new file mode 100644 index 0000000000000000000000000000000000000000..ad3ff59556342f395d26652175b1dc07bd6ba9f6 GIT binary patch literal 5052 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 P#lXnO#K^+P#vlm*GfGet literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/Code.class b/src/build/classes/java/main/Code.class new file mode 100644 index 0000000000000000000000000000000000000000..8a5a48672accbe7bf558c2b1e63294588884a9ba GIT binary patch literal 2636 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 literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/IdleClient.class b/src/build/classes/java/main/IdleClient.class new file mode 100644 index 0000000000000000000000000000000000000000..58ba71257b2a03e7b92e4669e19c0d71c63bd0d8 GIT binary patch literal 2630 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 U(9giYz{SAGFo9tb!xRQd09Lh!a{vGU literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/ManualMastermindClient.class b/src/build/classes/java/main/ManualMastermindClient.class new file mode 100644 index 0000000000000000000000000000000000000000..f07663a2511b88a9f74345107a5906350a5104b2 GIT binary patch literal 3237 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 literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/MastermindBotClient.class b/src/build/classes/java/main/MastermindBotClient.class new file mode 100644 index 0000000000000000000000000000000000000000..487e2d34227b8e6bfff5720ee31494a24bb18c90 GIT binary patch literal 3591 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 Z1e1rs<WYv>44}%Nk>LcxDTXr)k^oZOhams} literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/MastermindServer$GameSession.class b/src/build/classes/java/main/MastermindServer$GameSession.class new file mode 100644 index 0000000000000000000000000000000000000000..9228280d73890e34498c7428bc647bdf624953f3 GIT binary patch literal 3157 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 literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/MastermindServer.class b/src/build/classes/java/main/MastermindServer.class new file mode 100644 index 0000000000000000000000000000000000000000..47524fba4d211283cca898844e0d16ba29e043bb GIT binary patch literal 7286 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 GK@tEG7LpJE literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/ServerNIO$ClientData.class b/src/build/classes/java/main/ServerNIO$ClientData.class new file mode 100644 index 0000000000000000000000000000000000000000..0429fc9a1dc90a5f8f51aea90c77f64fe92761f2 GIT binary patch literal 841 zcmX^0Z`VEs1_nC@RW1f524;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SP6iGJPId+^9tLg(9!3U{;MAhB)FMAme--DP%+$ORm&B4pMh1?=l9JTi zf|6oJ21ZYi7Cs&Zeg*+X2Cjmf#LCnnzr@^BMg}1tgk`}cMVWc&){G1+&iN^+j12rf znR%&xrMXF|MInhvIbhZK$%#2(iA9+pK2(sUBqOt!kwMG{n>(x-83Z%)l8aJvQ}aq3 z;V$A%PetM}YiN2hGVm6smINR<O;iKZZJJ?>3@mwIm-D8hDi_hv#8l77z!jWdT9lmX zmI-n{AKZz0Aa64=aQLMbmw4nCm#{M^F*0z%r5PD`JoEBWi=1;3i;Gi>85y_`LCc`P zz`?-8z`(%7zyyi`FpHl-fPsO5m4OKqg$#@gf(#4{77R=bj0_A6Tw2>17`2$UGO%w1 zs}%x?flYYDz{2pFL70Jofd`_JL4-k+fq{XML5zV7YKkQTGgyvWD{>11J4*r<W8O1x zF?>KWh8u2-ID-V#7<~pturaJ!TNv2az}*3|g@NHSl4e%8W=RGqsAfB`Ul|zKw6wP} z@S^+TI|D1j53mVhU|+F8O<-VPV~}PL09!1>APY4M*&)0e&>Zp`Yz!nYU=CqskOQld XXHWpsiVVu&0Ays~U{GXGVc-G)FjkY8 literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/ServerNIO$GameSession.class b/src/build/classes/java/main/ServerNIO$GameSession.class new file mode 100644 index 0000000000000000000000000000000000000000..23622430f5d5dda10ebc858c7943fb3c0063258a GIT binary patch literal 2467 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 literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/ServerNIO$PlayerScore.class b/src/build/classes/java/main/ServerNIO$PlayerScore.class new file mode 100644 index 0000000000000000000000000000000000000000..147ad4f12fc86bd0704e97190139e04934c6556c GIT binary patch literal 1190 zcmX^0Z`VEs1_nC@Q!WN324;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00SP6iGJPId+^9tLg(9!3Vy;MAhB)FMAmf0clo#LCp7;N<+GR7M7tyu{p8 zMg}1tgmJ+oMVWc&)*u7;co_H@1Q;1uiy^8RJ%tz;7=(Bjgc(E_8N_oFvs0b(^O6%w z!ZS-Uob&UFOA_-+iWwQyH89Qd)Wj5HWDvuuGK`Ud#W_DEm63tpCo?bAuQWF)wJ0Pp zDF^J-{N%)(u*9NF5FaYYQj(Eb%*Y__gVmeXj127QsU?13uZn13bqGg#Y6&z<m^Cy# z85uZA@*yF?$iNkxUs{x$>Xr$zpAT+@9w^Kh894k>i%UH6i%ZxUR2UgJ;nIu@0#5n) zCB-F0i3Pr?B^miC#r$jx>Rb#O44Ui=TA)DGW@JzS83KvN%)GMv>{NY-t&nhaOH3}w zFREl@n1LKlP=ydfJreU$a#D*`eDd?NOAD+q0~tvKMPo>1K`IvI(MakcDa#r;z@SDr zC+6e?XO^T|b1>*KGVn86DKILOq~?_*mSmQt7Be#Nc;@A$7CGl678irK+(?OzoxzZi zK^4Q>*nGpzV9dxMhhHfp0~^Ha3<?Y!3``6R3``6{phOQ!si5S`z`(%5z{tSLAj-hV zAjZJJ5DCgj3=9nXTH6^IwY0Y~uxrU|W#HWi)+!Fx#=^kB$jrdP$il$M$jZRS$i^VS zz`&ruzzovHAju%b00R7AYZ$>|{0ssNObm<+(hM?CYxEfy89;KZT3Z;{H^2>N0|_#6 zf(_&Wu^CvQ1~M|pGRR@k%)16nGcQ)n@^G6iz%F56-~-vLwS|Fq7lR-J1G*E0kWAr& zI)Q~j0c@8dgA$llW>95dVBlb2WKd&ZWYA&I1BVV10|$dLgFXWng8_pPg9(Eq04Y@k AJOBUy literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/ServerNIO.class b/src/build/classes/java/main/ServerNIO.class new file mode 100644 index 0000000000000000000000000000000000000000..f460e76948e12d5db743e108c4316c6628bd058b GIT binary patch literal 9044 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 literal 0 HcmV?d00001 diff --git a/src/build/classes/java/main/Stress1.class b/src/build/classes/java/main/Stress1.class new file mode 100644 index 0000000000000000000000000000000000000000..4e0e6c1c098566f8928588db23f93821e10ef3a2 GIT binary patch literal 6827 zcmX^0Z`VEs1_nFE6fOoP24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk- z5<5l)W)00S4h9ZJ2JYO{;?knjV!h<zGIj<oMg|_RuFQOWx6GVWE(T5p9*}Xoj0~b0 zK42-Zfx#t3nR)5fnqeRn{5%W-41$adY^fEQ#U;gH)1%lKgc%vcz&bMX^_@!7(o&03 zQ^JcfOHzy28AKTwgkW+Yiy-1$3?dBTAnPO;8N{$y7X`9Uh(QXZM4FL77^);QUmv31 z8ssTiMg~v6{M@9X)cBOt_~e|-)Vz{n>yXskg5vnx{L0k4_`G6k-^{#th!BXASb^ZU zCMOn^#D`QCq{inJb8#^UG05{UC@}CcGO(6|9M8<aa5#XAL772?ok5j{L5)G3kwFgZ zmC};T9R1|{yyViNqSU++eb<WA<kFJ-qGCn{;k?vx=fvcU)Rd5nqSVBcfc*R%Mg|QH zO-PX9(ixmuRF;{XYR%4|$;hCL)e`6Y(!3Iv{PH}X#FFF;E(Q$-ZBXdwFfy=ccxr~R zGw3lgsA1KaSdyQcnXK;!rhM}A(zzIPLCMFEkwFuy2Iu^OO8-1?NIMo4C06=m7ME}_ z7%(skF)%Qg@GzJ%m@zUi7nSBQG898&2Hj&Ac3L9^0LVOKK2lJk`qCO2Y~Yj_RGOEU zn3R)h&COuJV9Cy4#lv9DV8h6ug4GYOIDv*NBLiD;X;N-x2_u6s)XAuZLTy6#hg)e$ zX;G>*D7fu-80<m0jWw}6F|!2Z2uB_UCy)q7aYkuLN`84BC}3T97+e|L7#Wz;Q%k@Z z#EYB3gTa%X!Hb8%o56>Xfe+zcP(XlOR#KFjn9Il@jgm}?!J_)XV9HvEfsw(FhrypA zfRTYcIX|}`u_%?1K>|gGGgvsWB)`a-n<0oHn4KYnhar?9jFCYcVJC{Qj10`VnR$#1 zI?ylydmqUd<WTW1D9OyvOU$w6Vu)afWM_!tVTfjkf%yj<nxMqR$iQBfm{XeSp9ade zUQiR@($-uIaSZY73<*38i3~}w!U1eA%mPLRw)`U3oZ?hQ1~sU=z}g{Y8%mmh3V~dd z!o!dX3U|(&{JiuqkPARzkj}%90SW--+{6k{JY?}OWHaP2GH`%OCs0U%${(m3!H)1O zNi712TXQqyG32u|6!0(<f{HvyA%>!ak%2uUvDh!Qq6DP2n1`W+p_Gw<B`>w2gpol6 z7Bk3BXLDeH04|0~hAMW3Y959fhFX*$^i3?uU}Rt}$S-GPVAXJO(R2Z+t><BAU}$7y zU@0yvDgotq7flx-1}27P9)=c%Rz?Q#+{Elu=ls0n#FFsLk__kkyyB9?JWvTOsp0A6 z<>dnPBG@s|BAt_=ouPxBp_7N9i=i8(5(%y>E=kR0WMIxOEn#F3h2-4KeEoo;%)AnK zdSqs3=3?k$=x1k`z{4;RRBj4`QyHp4Mh5l*khYvWAqEzP$sqSmL5o+Yd$2f>i$REC z8V|#CP$pwd&dD!MWoMYl$N;ei?3a*?qWp4DsldfBgJCug!yJaWj10VqDJj9F1qDT^ z#l@*9pj-m+0;&#cP@y>=W?E*xzNf!yMRF=Qm9sM}gcbH+O`drrsYOMl1tqB|a5Y>E ziy4-%Gc4s{SO#(*lB3{C7#aA%o)0cbOwJA|N=#1WVpzejlAU1{55sDPHK>6Ou4ow< zIMP!~oGMFFi$T$>8STWyu#RCpJHrMZhK&rHV6M#r)wGo*sgT;1k%6VWD6xQ%K~f{y z2^x&3Dy+E}wlHjEXV?a+;kGj}$b(}Fq$W8dF)uGQr&vEYKRG+K#2Laxgc(Q;$T<+3 ztTjDB?%B!1u!~_gBLhcbPELMuVhOk;^2BZPULJ;h4BHtQSU^=G$bbVp3<p8}XH5jv zFQ7m<464kIfYN-l6R7fE!ElU+;W)zyMh2FWqRd?M3<XUyTnz0Dr+64ngEBrxUSeK; zNM>#-$ggL47|t=AXJlZ>FG$T}WKf3XMv!-~d)b<u;UXi06eM6$OY}YSQcECV;+T>G zN=fVtml+w@LCL?k*pP$aDkB3Y$n!ZF`JmeI0>gEX4{m_U6QtAzb*CrDOIsLj@i5$G zxC1W0^YXy$G-+r7mzP=sjRB}_)|ycq4EGorSe)GbgSZ$jF+AX5c*yXGk%7B7H7~_C zwYWGjJ(ZEc45mLbUmu6RFkJ(3%q4~=JPc16o-s1;6{RMpW|pPG%`_!!CN!$Sc?0T2 zP~G=}hv6l|D@F#+#FP}rycBm(4alP5r3tPA-|#TJWq8NPz?_(pg4W1{7UP;xps1S$ zs%$^<Fnj{#D$ZnBvj<dMec@sF3M#9ZQ;UkY80Im2=VAB(N+Mk8sU=Y73o)=VOlD-@ z3w8|(a}A1jba4rC4Gv~x5W)-wMh0G3K?$xe7#X;sx&r)zLKqnsJ((F83@jNLxP2WX z;+=gwUHw9WnHd<EUobMTIOnINGBWV{Wag#%mF6a;7KMOHA&@=!$%#2(iA9+pK2(sU zBqOt!k%7|(ntH4m8CY@?K^3o<Ml`0wG{YDf7&93ec#2Ys3-a@dQ$eYkk%7^Rk%1!> z+SX)bP=ja$S4l`MD71!;H6sIS4yeV*$e@Z{16q@dkwLH|za%jy2*qw_l0df%vzf=p zz>DnaVnzl5Bx^wp9&1Jh;l#4kqQvx6R6F={GxN|z5-U(eSaMSn^B5TzT^Jcei%WBZ z3riD=Qd3+q!JUr0WKgNeQ3eY9yyR3y2F_Ga8z0ofXJlZ^V`N|hH|&cT86+TX0+pgD z{S|9Q2F6r)l?P7V@WLDvX^BPYphiBHIAdhsNXyJg4FFf)EFdN$10UQLP|wGjk%2R_ z*e|sl#9?G$jACRE^Fc{0l?AEL1fvAe2@Y;hnAt%1U<ZL3S=M&ej10WsYQ;CP0IZ3f zQHPO%DcX~rQ3+JQz{+t&h)z7^9wP&LF043VO9BT6JOn`6kV=0>1}=DT6f-jL<|O7O zr6j6=lCp{cBSQkwsRZIExc7+c41_T<aKI85BLgp_#|N*m5bYGCiX0T^#U+VFC6Fw{ z6`WsMl$;8Q0Ul^>)B~0Ij0^%!`S~TqB}It^zNsY{`6<QxY>akXjP{HU?2L{)j82Ts zj0{R3rI4O>W?or-cB;M)I0$@GOA^x(lS}f8D#1N%B;FZlpn&5JstIC&M`B(|PHM4= zPkw%OX#q40z{;RSDkPM^A}AU`2^v{B@sbcL@#{q{+o2{qC+6e?XO^T|3ox+pvoX4H zF<fGF=V3HqG!<a<WMoiB_9C<_M{+w<MAMU>jnSKnA%f9|hryrG7gX1Kd1-nIF#3Zk zXe15b6pqdZYY*gN3}OssXAI$CXkiS6_5F}T2oiLVrm!0<MrI&85b7r?#{tA%Yvhsv z=5HjQK<$QyCkJCVBLf$sH577jFh(*mcsfIdGOQFB6>1cGK_eM?sUS{XF^Hd;hhQgG zz}bhJA2n<M6?eKNl?71c9E{P745lHe#U;fGC8<TZnR$ns53MZLQwRdnr8y;uCB+KG ziKS(!>4`-tU_phH#Jpk!Mh?bUMg}$4qN3E&B88m%qGE-VRE3;Gh2;Faywr-!{5%Cn z_EWG@U}R+A@yyFhEppCDEG|whW@k)bWKhM(DcAy>oiPceoed2i6s3#|Y>*tnpvZ8E zfr){Eftf*y;TOYi21bTI3=9lR3|APW82&Q+gY*A0NHH=X_>7DUtPCK`#=yu3(y!0J z$iT?Jz`&}toq=&9$OuMe1_lN;upk#B3j+fK517r$$jZpZz`(%C$j-<C(afU3z{McV zz`%G)h}~y5181c6b_Q-=oox(!vl!S}mNT$0+wEo$irmd05~<Cyok46ngQOLU>`VqO zNfsfQZ47b(?0dK(nOXcJSy=reSp~TKBiRH}{3F=~nP2!vatI1{_(uw`2`Tzpu}ZS; zGh<^mV;5x?Wn09kDak6zu4l%vgF(rPb2o!Vq$tOB1}!VD-3+>s+Zpt&xOX!cL~ds= zvf^Pj;}zu<<ygcZBgrYrEy*LvwTr=+fng_uITJ&83oqmH|BofPwlUaBa_(esU}TWw z-p1f8%F&u@&MV2Ylfj*lVHblhNO>R=1LqEg@NEpS2N)u@F(jMwqsphD%L{^y>JsH> z&$krjvlIm>&tzn<5|<R;$&ky)Fq1(I#42KBfEp+vAu1-(B_W(H!cew@p(5E*bou{l z5~5%O#3jUcFw|K}O0tM@i1CW?iwR0d?qX<SVA#eWw~3(*S+EBr*xSO+xcuL>O$=?? zyBH>cMI>3aF-%>~AZf)4W${?CNwP|^ZDW`v$+~|z1D6#GNMg}O1{MZw#)XV48D=o9 zX57HInPCQlB;$U@Lk#nv^a2JJa0;2kpu)hwAi%)PAjrVOAjBZaAi|){Aj+W6AjV+E zAjwe1AjMG4AkEOmAj8nlAj>d=L7rg|g95`=26=|v42BE`7>pQ>Gng`5VlZR)#9+=S z#9+lJ$6(E<$Y8_h%wWqH!eGZ3&S1|N&)~qA#^A(Q#o)}?&mhS-mBEd1A%i>PN(K?e z{S2OrhZx)$k1%*Jo@DR>r`A&pA`G(`6c{-f{xR?}Ix`3|axro<NHA10iZJpp@-lET zv@vor@-gx=a53~VGB64-3Nmmr%wYJ=D8wktz{7BfVK1WyBR2yt!zYHhjG~O(4E&5j z47H46jNA-@jB*TxjN*(E48n|x40()_j1ml@jPVQxj8cpe4C0Jw44RD6j1nN<GfFbb zF#KcSV9;iq!YIoq$H2mPgn^Y&o>75;1(ahL6&aO4*_ZJ+qcS-A@-XgWRAE$QU}BJD z+{mcLsLsI5r~%D=5Z7rk@GxpIFfeRl;Qz}Y&d#ucoq^MV@h^icBRhl8KL$f~Mr}sM z{|rV9eC&+65NVJMSeTKW!GfJZgPlQ_oxy{Vf#DZ}{C|c#24Mm!Sy)(@nb{fgKpJ%Z zGuSe)qG(_MjjPT0&%nvRh9b_+FoS`SonZ#YPX;C@c80}l3|ycN8v_%#$O#3F*fTIN z@M~{lSiXZ{t*@5OHipgNh{A`D0aOI}GH@{XG4L_?gQHaeEXL2M$EXh;HsWVA00$cf z13RN3qY(oWqcH;m0}BHq!#oBqP-hNmSp)+!xSW&`WMtUEu){}7dmF=^@ZAh6BDJ?M z?BC9CXdA=P4e(+QVsj7!J3}x7FGC2}W-*9<sLh~Je2{&N2>S%MK(#-lNMt<Bz{<eI zz`!td2g6CH9SmncW!G+o3z0%s1Pv^=GhExoa5G$zRp{;xhWnDNI~X2YvF%_ushDcc zt|i94jp2EOwix>khVY#XubCLaC0UO#s7bPJV|c%uK@OB(k1>cqxja_vl5CRfpzO=G zUuPS`hvf{aR;-&CK7-`H?PB-|&h-!p9xF}|Ly~j<Mg}$pP6lU&0EQV1;S4bh@eDH< zSQxSyiWugB>23xFh9ZU*1`yrN&<m!S!MWX!L70JoL6L!lL5YErL773CL4`qyL6t$1 zL5;zHL7l;zL4(1WL6aeXL5U%oL5CrqL6@P3L6f0`L5rb<L5HD(L6@PML5E=?gD%4q z20d`V1~G6jXfjAKnlb!lU}G>~5C-Q|b_Py{Bt~;aeFj#B5(WWAc}5EcR#1R~b1EqA zr-E}TsM4AW&c{p)EDRGFEg88Pm>EI&!-0YQKSKZmD<rYAGib1|Gi(8;$Nvm`3~VUE z$SKv0onc-CDAh7BGg^U@gf*iL0|SE|0~@0)12dxwqbs8enB~Ff#puTvz`)2D1|}oG ZWE7Z;VT@y7VBlh4WQ=D_WK3p|1OQq71_uBD literal 0 HcmV?d00001 diff --git a/src/build/tmp/compileJava/previous-compilation-data.bin b/src/build/tmp/compileJava/previous-compilation-data.bin new file mode 100644 index 0000000000000000000000000000000000000000..c6b6ec41f70c960eb665522e31d0982be19a7210 GIT binary patch literal 650 zcmd;O2xfF=Qeh5eVd(ZvEG|hc%FWD6VP$AbEh<YbVq<7zXJ|>xP32%{Pc1Ia%+C|h zw7$UTbzto=clJ7?TZ`78<8<a?X!T6VN#$l}%gId5D-p=fco@6=R`y5Np3k}xZv=&T zf_Ve@RQUY`JO%xP7}|p&CbO}z2{W|iBvz&ti7>P#=NF|4d^vNiV(uxu1N<gdGZ)W% zu!mW|?wPb_*@B4Wr`E>Bp3?ZXP1HrqnU7nXp(U{-QQ+I=8Eal2X;5A$B3<=yZKRC^ zL#uOsN~*vE`CU0iH-o&{_3jv6*!6FbBtu7VNl|KXv7tcll(WIPj`z64;uzP&FEU*# z<t**QBE!&}U&1Z$lO?@TuJnUuz#XNKyJ7cE$~w#W$}_b4CgznU<|r_9!2^d|;QiF; z?a4*9muGK#w`+Nn$t6X9B~N8P6^3?aa0sxmu?d*Yd9>niUgV`MS{wI!DX+hwB2Zyw zC;wk>)`VAz53=tslljLlP<dK@+ntru+#O22l{r5s>{1O@bLV5{5U5w&m^NGR=)CpO z?e!}kED>kpVPxcIRApdbWMpPwU}j`wU|<ksWaMXH;Adp!5mjYiPzCcCB^VeO7;nfi zZD?RX0?3>OkX}x8J$?;_)~v*`L<R;17JgAx9!)((4UlF<Ej>;!gHu~i63md)(PIWN zn3x%K^<+UTMp->QDKJAyUrz$ekTB3w0W(xU<}(_48wDHdndq77X_zsz<YnfYGjt|r kB<AI%<`lD8Fm$Hoq$ZbS=I2>5G^bWFvM?*E@G~#~0NU2P^#A|> literal 0 HcmV?d00001 diff --git a/src/gradle/wrapper/gradle-wrapper.jar b/src/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..249e5832f090a2944b7473328c07c9755baa3196 GIT binary patch literal 60756 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 literal 0 HcmV?d00001 diff --git a/src/gradle/wrapper/gradle-wrapper.properties b/src/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ae04661 --- /dev/null +++ b/src/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/src/gradlew b/src/gradlew new file mode 100644 index 0000000..a69d9cb --- /dev/null +++ b/src/gradlew @@ -0,0 +1,240 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/src/gradlew.bat b/src/gradlew.bat new file mode 100644 index 0000000..f127cfd --- /dev/null +++ b/src/gradlew.bat @@ -0,0 +1,91 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/settings.gradle b/src/settings.gradle new file mode 100644 index 0000000..0b03f4c --- /dev/null +++ b/src/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'src' + diff --git a/src/src/main/java/Client.java b/src/src/main/java/Client.java new file mode 100644 index 0000000..1aed5c5 --- /dev/null +++ b/src/src/main/java/Client.java @@ -0,0 +1,123 @@ +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.*; +import java.util.Scanner; + +public class Client { + private static final String SERVER_ADDRESS = "localhost"; + private static final int PORT = 12345; + private static final int BUFFER_SIZE = 256; + private static Scanner scanner = new Scanner(System.in); + + public static void main(String[] args) { + try { + // Connexion et ouverture du canal + SocketChannel clientChannel = SocketChannel.open(new InetSocketAddress(SERVER_ADDRESS, PORT)); + clientChannel.configureBlocking(false); + Selector selector = Selector.open(); + clientChannel.register(selector, SelectionKey.OP_READ); + + System.out.println("[CLIENT] Connecté au serveur sur " + SERVER_ADDRESS + ":" + PORT); + + // Attente de la demande du serveur + while (true) { + int readyChannels = selector.select(100); // Timeout pour éviter un blocage + if (readyChannels == 0) continue; + + for (SelectionKey key : selector.selectedKeys()) { + selector.selectedKeys().remove(key); + + if (key.isReadable()) { + + ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); + SocketChannel channel = (SocketChannel) key.channel(); + int bytesRead = channel.read(buffer); + + if (bytesRead == -1) { + System.out.println("[CLIENT] Serveur déconnecté"); + channel.close(); + return; + } + + buffer.flip(); + String message = new String(buffer.array(), 0, bytesRead).trim(); + System.out.println("[CLIENT] " + message); + + if (message.contains("Entrez une combinaison")) { + System.out.print("Entrez une combinaison (4 lettres parmi B,G,O,R,W,Y) : "); + String input = scanner.nextLine().toUpperCase(); + + if (!input.matches("[BGORWY]{4}")) { + System.out.println("Combinaison invalide."); + continue; + } + + // Envoie la combinaison au serveur + ByteBuffer sendBuffer = ByteBuffer.wrap(input.getBytes()); + channel.write(sendBuffer); + } else if (message.contains("Entrez votre nom")) { + // Demander à l'utilisateur son nom + System.out.print("Entrez votre nom : "); + String playerName = scanner.nextLine(); + + // Envoyer le nom au serveur + ByteBuffer sendBuffer = ByteBuffer.wrap(playerName.getBytes()); + channel.write(sendBuffer); + + // Attendre une confirmation de la part du serveur + ByteBuffer confirmationBuffer = ByteBuffer.allocate(BUFFER_SIZE); + int confirmationBytesRead = channel.read(confirmationBuffer); + + if (confirmationBytesRead == -1) { + System.out.println("[CLIENT] Serveur déconnecté"); + channel.close(); + return; + } + + confirmationBuffer.flip(); + String confirmationMessage = new String(confirmationBuffer.array(), 0, confirmationBytesRead).trim(); + System.out.println("[CLIENT] " + confirmationMessage); + + // Afficher un message confirmant la victoire et la saisie du nom + System.out.println("[CLIENT] Vous avez gagné !"); + + // Demander les meilleurs scores + System.out.println("Tapez '/SCORE' pour voir les meilleurs scores."); + String command = scanner.nextLine(); + if ("/SCORE".equals(command)) { + ByteBuffer scoreRequestBuffer = ByteBuffer.wrap(command.getBytes()); + channel.write(scoreRequestBuffer); + + // Lire la réponse avec les scores + ByteBuffer scoreBuffer = ByteBuffer.allocate(BUFFER_SIZE); + int scoreBytesRead = channel.read(scoreBuffer); + + if (scoreBytesRead == -1) { + System.out.println("[CLIENT] Serveur déconnecté"); + channel.close(); + return; + } + + scoreBuffer.flip(); + String scoreList = new String(scoreBuffer.array(), 0, scoreBytesRead).trim(); + System.out.println("[CLIENT] Liste des meilleurs scores :"); + System.out.println(scoreList); + } + channel.close(); + return; + } + + else if (message.contains("Félicitations")) { + System.out.println("[CLIENT] Vous avez gagné !"); + return; + } + } + } + } + } catch (IOException e) { + System.err.println("[CLIENT] Erreur de connexion : " + e.getMessage()); + } + } + +} \ No newline at end of file diff --git a/src/src/main/java/ClientNIO.java b/src/src/main/java/ClientNIO.java new file mode 100644 index 0000000..2784dfc --- /dev/null +++ b/src/src/main/java/ClientNIO.java @@ -0,0 +1,127 @@ +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.*; +import java.util.Scanner; + +public class ClientNIO { + private static final String SERVER_ADDRESS = "localhost"; + private static final int PORT = 12345; + private static final int BUFFER_SIZE = 256; + private static Scanner scanner = new Scanner(System.in); + + public static void main(String[] args) { + try { + // Connexion et ouverture du canal + SocketChannel clientChannel = SocketChannel.open(new InetSocketAddress(SERVER_ADDRESS, PORT)); + clientChannel.configureBlocking(false); + Selector selector = Selector.open(); + clientChannel.register(selector, SelectionKey.OP_READ); + + System.out.println("[CLIENT] Connecté au serveur sur " + SERVER_ADDRESS + ":" + PORT); + + // Attente de la demande du serveur + while (true) { + int readyChannels = selector.select(100); // Timeout pour éviter un blocage + if (readyChannels == 0) continue; + + for (SelectionKey key : selector.selectedKeys()) { + selector.selectedKeys().remove(key); + + if (key.isReadable()) { + + ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); + SocketChannel channel = (SocketChannel) key.channel(); + int bytesRead = channel.read(buffer); + + if (bytesRead == -1) { + System.out.println("[CLIENT] Serveur déconnecté"); + channel.close(); + return; + } + + buffer.flip(); + String message = new String(buffer.array(), 0, bytesRead).trim(); + System.out.println("[CLIENT] " + message); + + if (message.contains("Entrez une combinaison")) { + System.out.print("Entrez une combinaison (4 lettres parmi B,G,O,R,W,Y) : "); + String input = scanner.nextLine().toUpperCase(); + + if (!input.matches("[BGORWY]{4}")) { + System.out.println("Combinaison invalide."); + continue; + } + + // Envoie la combinaison au serveur + ByteBuffer sendBuffer = ByteBuffer.wrap(input.getBytes()); + channel.write(sendBuffer); + } else if (message.contains("Entrez votre nom")) { + // Demander à l'utilisateur son nom + System.out.print("Entrez votre nom : "); + String playerName = scanner.nextLine(); + + // Envoyer le nom au serveur + ByteBuffer sendBuffer = ByteBuffer.wrap(playerName.getBytes()); + channel.write(sendBuffer); + + // Attendre une confirmation de la part du serveur + ByteBuffer confirmationBuffer = ByteBuffer.allocate(BUFFER_SIZE); + int confirmationBytesRead = channel.read(confirmationBuffer); + + if (confirmationBytesRead == -1) { + System.out.println("[CLIENT] Serveur déconnecté"); + channel.close(); + return; + } + + confirmationBuffer.flip(); + String confirmationMessage = new String(confirmationBuffer.array(), 0, confirmationBytesRead).trim(); + System.out.println("[CLIENT] " + confirmationMessage); + + // Afficher un message confirmant la victoire et la saisie du nom + System.out.println("[CLIENT] Vous avez gagné !"); + + // Demander les meilleurs scores + System.out.println("Tapez '/SCORE' pour voir les meilleurs scores."); + String command = scanner.nextLine(); + if ("/SCORE".equals(command)) { + ByteBuffer scoreRequestBuffer = ByteBuffer.wrap(command.getBytes()); + channel.write(scoreRequestBuffer); + + // Lire la réponse avec les scores + ByteBuffer scoreBuffer = ByteBuffer.allocate(BUFFER_SIZE); + int scoreBytesRead = channel.read(scoreBuffer); + + if (scoreBytesRead == -1) { + System.out.println("[CLIENT] Serveur déconnecté"); + channel.close(); + return; + } + + scoreBuffer.flip(); + String scoreList = new String(scoreBuffer.array(), 0, scoreBytesRead).trim(); + System.out.println("[CLIENT] Liste des meilleurs scores :"); + System.out.println(scoreList); + } + + return; + } + else if (message.contains("Meilleurs scores")) { + System.out.println("[CLIENT] " + message); + } + + + else if (message.contains("Félicitations")) { + System.out.println("[CLIENT] Vous avez gagné !"); + return; + } + } + } + } + } catch (IOException e) { + System.err.println("[CLIENT] Erreur de connexion : " + e.getMessage()); + } + } + +} \ No newline at end of file diff --git a/src/src/main/java/Code.java b/src/src/main/java/Code.java new file mode 100644 index 0000000..abaf4fb --- /dev/null +++ b/src/src/main/java/Code.java @@ -0,0 +1,80 @@ +import java.util.Random; + +public class Code { + public static final int CODE_LENGTH = 4; + public static char[] COLORS = new char[]{'B','G','O','R','W','Y'}; + private final char[] codeWord = new char[CODE_LENGTH]; + + public Code(Random random){ + for (int i = 0; i < CODE_LENGTH; i++) { + codeWord[i] = COLORS[random.nextInt(COLORS.length)]; + } + } + + public Code(String codeString){ + assert(codeString.length() == CODE_LENGTH); + for(int i=0; i<CODE_LENGTH; i++) + codeWord[i] = codeString.charAt(i); + } + + @Override + public String toString() { + return new String(codeWord); + } + + /** + * return the number of colors of guess that are correctly positioned + */ + public int numberOfColorsWithCorrectPosition(Code guess){ + int count = 0; + for(char color : COLORS){ + count += numberOfMatches(color, guess); + } + return count; + } + + /** + * return the number of colors of guess that are in this codeWord + * but do not have the correct position + */ + public int numberOfColorsWithIncorrectPosition(Code guess){ + int count = 0; + for(char color:COLORS){ + int nMatchedOccurrences = numberOfMatches(color, guess); + int nUnmatchedOccurrencesCode = numberOfOccurrences(color, this) - nMatchedOccurrences; + int nUnmatchedOccurrencesGuess = numberOfOccurrences(color, guess) - nMatchedOccurrences; + count += Math.min(nUnmatchedOccurrencesCode, nUnmatchedOccurrencesGuess); + } + return count; + } + + + private int numberOfOccurrences(char color, Code code){ + int count = 0; + for (int i = 0; i < CODE_LENGTH; i++) { + if (code.codeWord[i] == color) count++; + } + return count; + } + + private int numberOfMatches(char color, Code guess){ + int count = 0; + for (int i = 0; i < CODE_LENGTH; i++) { + if ((this.codeWord[i] == guess.codeWord[i]) && (this.codeWord[i] == color)){ + count++; + } + } + return count; + } + + public char[] getCodeWord() { + return codeWord; + } + + @Override + public boolean equals(Object o){ + if (o == null) return false; + if (!(o instanceof Code)) return false; + return this.toString().equals(o.toString()); + } +} diff --git a/src/src/main/java/IdleClient.java b/src/src/main/java/IdleClient.java new file mode 100644 index 0000000..c1c5e5e --- /dev/null +++ b/src/src/main/java/IdleClient.java @@ -0,0 +1,31 @@ +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; + +public class IdleClient { + private static final String SERVER_ADDRESS = "localhost"; + private static final int SERVER_PORT = 12345; + + public static void main(String[] args) { + try (SocketChannel clientChannel = SocketChannel.open()) { + clientChannel.connect(new InetSocketAddress(SERVER_ADDRESS, SERVER_PORT)); + sendMessage(clientChannel, "BGOR"); + String response = receiveMessage(clientChannel); + System.out.println("[CLIENT] Réponse du serveur : " + response); + } catch (IOException e) { + System.err.println("[CLIENT] Erreur : " + e.getMessage()); + } + } + + private static void sendMessage(SocketChannel channel, String message) throws IOException { + ByteBuffer buffer = ByteBuffer.wrap(message.getBytes()); + channel.write(buffer); + } + + private static String receiveMessage(SocketChannel channel) throws IOException { + ByteBuffer buffer = ByteBuffer.allocate(256); + channel.read(buffer); + return new String(buffer.array()).trim(); + } +} diff --git a/src/src/main/java/ManualMastermindClient.java b/src/src/main/java/ManualMastermindClient.java new file mode 100644 index 0000000..3cafac6 --- /dev/null +++ b/src/src/main/java/ManualMastermindClient.java @@ -0,0 +1,50 @@ +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; +import java.util.Scanner; + +public class ManualMastermindClient { + private static final String SERVER_HOST = "localhost"; + private static final int SERVER_PORT = 1234; + + public static void main(String[] args) { + try (SocketChannel socketChannel = SocketChannel.open()) { + socketChannel.connect(new InetSocketAddress(SERVER_HOST, SERVER_PORT)); + Scanner inputScanner = new Scanner(System.in); + + while (true) { + System.out.print("Enter a combination (or /SCORE to see the high scores): "); + String userGuess = inputScanner.nextLine(); + sendToServer(socketChannel, userGuess); + + String serverResponse = receiveFromServer(socketChannel); + System.out.println("[SERVER] " + serverResponse); + + if (serverResponse.contains(" Félicitations")) { + System.out.print("Enter your name to save the score: "); + String playerName = inputScanner.nextLine(); + sendToServer(socketChannel, playerName); + System.out.println("Score saved!"); + break; + } + } + } catch (IOException e) { + System.err.println("[CLIENT] Error: " + e.getMessage()); + } + } + + private static void sendToServer(SocketChannel channel, String message) throws IOException { + ByteBuffer buffer = ByteBuffer.wrap(message.getBytes()); + channel.write(buffer); + } + + private static String receiveFromServer(SocketChannel channel) throws IOException { + ByteBuffer buffer = ByteBuffer.allocate(256); + int bytesRead = channel.read(buffer); + if (bytesRead == -1) { + return ""; // Return empty string if the connection is closed + } + return new String(buffer.array(), 0, bytesRead).trim(); + } +} diff --git a/src/src/main/java/MastermindBotClient.java b/src/src/main/java/MastermindBotClient.java new file mode 100644 index 0000000..c96673e --- /dev/null +++ b/src/src/main/java/MastermindBotClient.java @@ -0,0 +1,60 @@ +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; +import java.util.Random; + +public class MastermindBotClient { + private static final String SERVER_HOST = "localhost"; + private static final int SERVER_PORT = 1234; + private static final String COLOR_OPTIONS = "GBORY"; + + public static void main(String[] args) { + try (SocketChannel socketChannel = SocketChannel.open()) { + socketChannel.connect(new InetSocketAddress(SERVER_HOST, SERVER_PORT)); + Random rand = new Random(); + int attemptCount = 0; + + while (true) { + String generatedGuess = createRandomGuess(rand); + sendToServer(socketChannel, generatedGuess); + System.out.println("[BOT] Sending: " + generatedGuess); + + String serverResponse = receiveFromServer(socketChannel); + System.out.println("[SERVER] " + serverResponse); + + attemptCount++; + + if (serverResponse.contains(" Félicitations")) { + sendToServer(socketChannel, "Bot_" + attemptCount); + System.out.println("[BOT] Score saved!"); + break; + } + } + } catch (IOException e) { + System.err.println("[BOT] Error: " + e.getMessage()); + } + } + + private static String createRandomGuess(Random rand) { + StringBuilder guess = new StringBuilder(); + for (int i = 0; i < 4; i++) { + guess.append(COLOR_OPTIONS.charAt(rand.nextInt(COLOR_OPTIONS.length()))); + } + return guess.toString(); + } + + private static void sendToServer(SocketChannel channel, String message) throws IOException { + ByteBuffer buffer = ByteBuffer.wrap(message.getBytes()); + channel.write(buffer); + } + + private static String receiveFromServer(SocketChannel channel) throws IOException { + ByteBuffer buffer = ByteBuffer.allocate(256); + int bytesRead = channel.read(buffer); + if (bytesRead == -1) { + return ""; // Return empty string if the connection is closed. + } + return new String(buffer.array(), 0, bytesRead).trim(); + } +} diff --git a/src/src/main/java/MastermindServer.java b/src/src/main/java/MastermindServer.java new file mode 100644 index 0000000..20c1100 --- /dev/null +++ b/src/src/main/java/MastermindServer.java @@ -0,0 +1,178 @@ +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.*; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +public class MastermindServer { + private static final int PORT = 1234; + private static final int BUFFER_SIZE = 256; + private static final Map<String, Integer> scoreBoard = new ConcurrentHashMap<>(); + private static Selector selector; + + public static void main(String[] args) { + try { + selector = Selector.open(); + ServerSocketChannel serverChannel = ServerSocketChannel.open(); + serverChannel.bind(new InetSocketAddress(PORT)); + serverChannel.configureBlocking(false); + serverChannel.register(selector, SelectionKey.OP_ACCEPT); + + System.out.println("[SERVER] Waiting for connections on port " + PORT + "..."); + + while (true) { + selector.select(); + Iterator<SelectionKey> selectedKeys = selector.selectedKeys().iterator(); + + while (selectedKeys.hasNext()) { + SelectionKey key = selectedKeys.next(); + selectedKeys.remove(); + if (!key.isValid()) continue; + + try { + if (key.isAcceptable()) { + acceptNewClient(serverChannel); + } else if (key.isReadable()) { + handleClientRequest(key); + } + } catch (IOException e) { + key.cancel(); + } + } + } + } catch (IOException e) { + System.err.println("[SERVER] Critical error: " + e.getMessage()); + } + } + + private static void acceptNewClient(ServerSocketChannel serverChannel) throws IOException { + SocketChannel clientChannel = serverChannel.accept(); + clientChannel.configureBlocking(false); + SelectionKey key = clientChannel.register(selector, SelectionKey.OP_READ); + key.attach(new GameSession()); + System.out.println("[SERVER] New client connected: " + clientChannel.getRemoteAddress()); + } + + private static void handleClientRequest(SelectionKey key) { + SocketChannel clientChannel = (SocketChannel) key.channel(); + ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); + + try { + int bytesRead = clientChannel.read(buffer); + if (bytesRead == -1) { + disconnectClient(clientChannel); + return; + } + + buffer.flip(); + String input = new String(buffer.array(), 0, bytesRead).trim(); + System.out.println("[SERVER] Received: " + input); + + GameSession session = (GameSession) key.attachment(); + if (input.equals("/SCORE")) { + sendToClient(clientChannel, getFormattedScoreBoard()); + return; + } + + String response = session.processGuess(input); + sendToClient(clientChannel, response); + + if (response.contains("Congratulations")) { + sendToClient(clientChannel, "Enter your name to save the score:"); + buffer.clear(); + bytesRead = clientChannel.read(buffer); + if (bytesRead > 0) { + buffer.flip(); + String playerName = new String(buffer.array(), 0, bytesRead).trim(); + if (!playerName.isEmpty()) { + scoreBoard.put(playerName, session.getAttempts()); + } + } + } + } catch (IOException e) { + disconnectClient(clientChannel); + } + } + + private static void sendToClient(SocketChannel clientChannel, String message) { + try { + ByteBuffer buffer = ByteBuffer.wrap((message + "\n").getBytes()); + clientChannel.write(buffer); + } catch (IOException e) { + disconnectClient(clientChannel); + } + } + + private static void disconnectClient(SocketChannel clientChannel) { + try { + System.out.println("[SERVER] Client disconnected: " + clientChannel.getRemoteAddress()); + clientChannel.close(); + } catch (IOException e) { + System.err.println("[SERVER] Disconnection error: " + e.getMessage()); + } + } + + private static String getFormattedScoreBoard() { + StringBuilder sb = new StringBuilder("Best Scores:\n"); + scoreBoard.entrySet().stream() + .sorted(Map.Entry.comparingByValue()) + .forEach(entry -> sb.append(entry.getKey()).append(" : ").append(entry.getValue()).append(" attempts\n")); + return sb.toString(); + } + + private static class GameSession { + private final String secretCode; + private int attempts; + + public GameSession() { + this.secretCode = generateSecretCode(); + this.attempts = 0; + System.out.println("[SERVER] Secret code generated: " + secretCode); + } + + public String processGuess(String guess) { + attempts++; + int correctPosition = 0; + int correctColor = 0; + + Map<Character, Integer> secretMap = new HashMap<>(); + for (char c : secretCode.toCharArray()) secretMap.put(c, secretMap.getOrDefault(c, 0) + 1); + + for (int i = 0; i < guess.length(); i++) { + char g = guess.charAt(i); + if (g == secretCode.charAt(i)) { + correctPosition++; + secretMap.put(g, secretMap.get(g) - 1); + } + } + + for (int i = 0; i < guess.length(); i++) { + char g = guess.charAt(i); + if (g != secretCode.charAt(i) && secretMap.getOrDefault(g, 0) > 0) { + correctColor++; + secretMap.put(g, secretMap.get(g) - 1); + } + } + + if (correctPosition == 4) { + return "Congratulations! You've guessed the code in " + attempts + " attempts."; + } + return correctPosition + " correct position(s), " + correctColor + " correct color(s) (Attempt " + attempts + ")"; + } + + public int getAttempts() { + return attempts; + } + + private String generateSecretCode() { + String colors = "BGORWY"; + Random random = new Random(); + StringBuilder code = new StringBuilder(); + for (int i = 0; i < 4; i++) { + code.append(colors.charAt(random.nextInt(colors.length()))); + } + return code.toString(); + } + } +} diff --git a/src/src/main/java/ServerNIO.java b/src/src/main/java/ServerNIO.java new file mode 100644 index 0000000..05f2c44 --- /dev/null +++ b/src/src/main/java/ServerNIO.java @@ -0,0 +1,277 @@ +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.*; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +public class ServerNIO { + private static final int PORT = 12345; + private static final int BUFFER_SIZE = 256; + private static final Map<SocketChannel, GameSession> clientSessions = new ConcurrentHashMap<>(); + private static final List<PlayerScore> highScores = new ArrayList<>(); + private static Selector selector; + + public static void main(String[] args) { + try { + selector = Selector.open(); + ServerSocketChannel serverChannel = ServerSocketChannel.open(); + serverChannel.bind(new InetSocketAddress(PORT)); + serverChannel.configureBlocking(false); + serverChannel.register(selector, SelectionKey.OP_ACCEPT); + + System.out.println("[SERVEUR] En attente de connexions sur le port " + PORT + "..."); + + while (true) { + int readyChannels = selector.select(100); // Timeout pour éviter les blocages + + if (readyChannels == 0) continue; + + Iterator<SelectionKey> keyIterator = selector.selectedKeys().iterator(); + + while (keyIterator.hasNext()) { + SelectionKey key = keyIterator.next(); + keyIterator.remove(); + + try { + if (key.isAcceptable()) { + acceptClient(serverChannel); + } else if (key.isReadable()) { + readClientData(key); + } + } catch (IOException e) { + key.cancel(); // Retirer la clé en cas d'erreur + } + } + } + } catch (IOException e) { + System.err.println("[SERVEUR] Erreur critique : " + e.getMessage()); + } + } + + private static void acceptClient(ServerSocketChannel serverChannel) throws IOException { + SocketChannel clientChannel = serverChannel.accept(); + clientChannel.configureBlocking(false); + SelectionKey key = clientChannel.register(selector, SelectionKey.OP_READ); + clientSessions.put(clientChannel, new GameSession()); + key.attach(new ClientData()); // Attacher un objet ClientData pour suivre les informations du client + + System.out.println("[SERVEUR] Nouveau client connecté : " + clientChannel.getRemoteAddress()); + + // Envoi du message initial demandant une combinaison + sendMessage(clientChannel, "Entrez une combinaison (4 lettres parmi B,G,O,R,W,Y) : "); + } + + private static void readClientData(SelectionKey key) { + SocketChannel clientChannel = (SocketChannel) key.channel(); + ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); + + try { + int bytesRead = clientChannel.read(buffer); + if (bytesRead == -1) { + disconnectClient(clientChannel); + return; + } + + buffer.flip(); + String input = new String(buffer.array(), 0, bytesRead).trim(); + System.out.println("[SERVEUR] Réception : " + input); + + GameSession session = clientSessions.get(clientChannel); + ClientData clientData = (ClientData) key.attachment(); // Récupérer les données attachées + + if (session != null) { + if (session.isGameFinished()) { + // Si le jeu est terminé, demander le nom du joueur + if (clientData.getPlayerName() == null) { + clientData.setPlayerName(input); // Nom du joueur reçu + int score = clientData.getAttempts(); + PlayerScore playerScore = new PlayerScore(clientData.getPlayerName(), score); + session.setPlayerScore(playerScore); + highScores.add(playerScore); + highScores.sort(Comparator.comparingInt(PlayerScore::getScore)); // Trier par score + + sendMessage(clientChannel, "Votre nom a été enregistré avec un score de " + score + " tentatives.\n"); + sendMessage(clientChannel, "Tapez /SCORE pour voir le tableau des meilleurs scores."); + key.interestOps(SelectionKey.OP_READ); // Revenir en mode lecture pour recevoir /SCORE ou d'autres commandes + } else { + handleClientRequest(clientChannel, input); // Appeler la méthode pour gérer les commandes comme /SCORE + } + } else { + // Si le jeu n'est pas encore terminé, traiter la tentative de combinaison + String response = session.processGuess(input); + clientData.incrementAttempts(); + sendMessage(clientChannel, response); + + if (response.contains("Félicitations")) { + sendMessage(clientChannel, "Félicitations ! Entrez votre nom : "); + key.interestOps(SelectionKey.OP_WRITE); // Passer en mode écriture pour obtenir le nom + } else { + sendMessage(clientChannel, "Entrez une nouvelle combinaison : "); + key.interestOps(SelectionKey.OP_READ); // Revenir en mode lecture pour recevoir la nouvelle tentative + } + } + } + } catch (IOException e) { + disconnectClient(clientChannel); + } + } + + private static void handleClientRequest(SocketChannel clientChannel, String input) { + // Si le client envoie "/SCORE" + if ("/SCORE".equals(input)) { + // Afficher les meilleurs scores + StringBuilder scoreList = new StringBuilder("Meilleurs scores :\n"); + + // Trie les scores par ordre décroissant si ce n'est pas déjà fait + highScores.sort((ps1, ps2) -> Integer.compare(ps2.getScore(), ps1.getScore())); + + // Construire la liste des meilleurs scores + for (PlayerScore ps : highScores) { + scoreList.append(ps).append("\n"); + } + + // Envoyer la liste des meilleurs scores au client + sendMessage(clientChannel, scoreList.toString()); + } + } + + + + private static int countCorrectPositions(String secretCode, String guess) { + int count = 0; + for (int i = 0; i < secretCode.length(); i++) { + if (secretCode.charAt(i) == guess.charAt(i)) { + count++; + } + } + return count; + } + + private static int countIncorrectPositions(String secretCode, String guess) { + int count = 0; + for (int i = 0; i < secretCode.length(); i++) { + if (secretCode.indexOf(guess.charAt(i)) != -1 && secretCode.charAt(i) != guess.charAt(i)) { + count++; + } + } + return count; + } + + + private static void sendMessage(SocketChannel clientChannel, String message) { + try { + ByteBuffer buffer = ByteBuffer.wrap(message.getBytes()); + clientChannel.write(buffer); + } catch (IOException e) { + disconnectClient(clientChannel); + } + } + + private static void disconnectClient(SocketChannel clientChannel) { + try { + System.out.println("[SERVEUR] Client déconnecté : " + clientChannel.getRemoteAddress()); + GameSession session = clientSessions.remove(clientChannel); + if (session != null && session.isGameFinished()) { + PlayerScore score = session.getPlayerScore(); + if (score != null) { // Vérifier si le score est bien défini + highScores.add(score); + highScores.sort(Comparator.comparingInt(PlayerScore::getScore)); // Trier par score + } + } + clientChannel.close(); + } catch (IOException e) { + System.err.println("[SERVEUR] Erreur de fermeture : " + e.getMessage()); + } + } + + + private static class GameSession { + private final String secretCode; + private boolean gameFinished = false; + private PlayerScore playerScore; + + public GameSession() { + this.secretCode = generateSecretCode(); + System.out.println("[SERVEUR] Code secret généré : " + secretCode); + } + + public String processGuess(String guess) { + if (guess.equals(secretCode)) { + gameFinished = true; + return "Félicitations ! Vous avez trouvé la combinaison correcte."; + } + return "Mauvaise combinaison, réessayez."; + } + + private String generateSecretCode() { + String colors = "BGORWY"; + Random random = new Random(); + StringBuilder code = new StringBuilder(); + for (int i = 0; i < 4; i++) { + code.append(colors.charAt(random.nextInt(colors.length()))); + } + return code.toString(); + } + + public boolean isGameFinished() { + return gameFinished; + } + + public PlayerScore getPlayerScore() { + return playerScore; + } + + public void setPlayerScore(PlayerScore playerScore) { + this.playerScore = playerScore; + } + + public String getSecretCode() { + return secretCode; + } + } + + private static class ClientData { + private int attempts = 0; + private String playerName; + + public void incrementAttempts() { + attempts++; + } + + public int getAttempts() { + return attempts; + } + + public void setPlayerName(String name) { + this.playerName = name; + } + + public String getPlayerName() { + return playerName; + } + } + + private static class PlayerScore { + private final String name; + private final int score; + + public PlayerScore(String name, int score) { + this.name = name; + this.score = score; + } + + public String getName() { + return name; + } + + public int getScore() { + return score; + } + + @Override + public String toString() { + return name + ": " + score + " tentatives"; + } + } +} diff --git a/src/src/main/java/Stress1.java b/src/src/main/java/Stress1.java new file mode 100644 index 0000000..ba37970 --- /dev/null +++ b/src/src/main/java/Stress1.java @@ -0,0 +1,86 @@ +import java.io.*; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicLong; + +public class Stress1 { + private static final String SERVER_ADDRESS = "localhost"; + private static final int SERVER_PORT = 12345; + private static final int MAX_CLIENTS = 1000; + + public static void main(String[] args) { + String filePath = "mesures.csv"; + File file = new File(filePath); + boolean isNewFile = !file.exists(); + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) { + if (isNewFile) { + writer.write("Nombre_de_clients;Temps_moyen_ns;Min_Temps_ns;Max_Temps_ns;Ecart_Type_ns\n"); + } + + for (int n : new int[]{1, 2, 10, 100, 1000, 5000, 50000}) { + ExecutorService executor = Executors.newCachedThreadPool(); + CountDownLatch latch = new CountDownLatch(n); + AtomicLong totalResponseTime = new AtomicLong(); + List<Long> responseTimes = new CopyOnWriteArrayList<>(); + + for (int i = 0; i < n; i++) { + executor.submit(() -> { + long startTime = System.nanoTime(); + try (SocketChannel clientChannel = SocketChannel.open()) { + clientChannel.connect(new InetSocketAddress(SERVER_ADDRESS, SERVER_PORT)); + sendMessage(clientChannel, "BGOR"); + String response = receiveMessage(clientChannel); + long responseTime = System.nanoTime() - startTime; + totalResponseTime.addAndGet(responseTime); + responseTimes.add(responseTime); + } catch (IOException e) { + System.err.println("Erreur lors de la connexion client : " + e.getMessage()); + } finally { + latch.countDown(); + } + }); + } + + latch.await(); + executor.shutdown(); + + // Calculs statistiques + long averageResponseTime = totalResponseTime.get() / n; + long minResponseTime = responseTimes.stream().min(Long::compare).orElse(0L); + long maxResponseTime = responseTimes.stream().max(Long::compare).orElse(0L); + + // Calcul de la variance et écart-type + double mean = totalResponseTime.get() / (double) n; + double sumSquaredDifferences = 0.0; + for (long responseTime : responseTimes) { + sumSquaredDifferences += Math.pow(responseTime - mean, 2); + } + double variance = sumSquaredDifferences / n; + double ecartType = Math.sqrt(variance); + + writer.write(n + ";" + averageResponseTime + ";" + minResponseTime + ";" + maxResponseTime + ";" + ecartType + "\n"); + System.out.println("Clients: " + n + " | Moyenne: " + averageResponseTime + " ns | Min: " + minResponseTime + " ns | Max: " + maxResponseTime + " ns | Écart-type: " + ecartType + " ns"); + } + + System.out.println("Tests terminés. Résultats sauvegardés dans " + filePath); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } + + private static void sendMessage(SocketChannel channel, String message) throws IOException { + ByteBuffer buffer = ByteBuffer.wrap(message.getBytes()); + channel.write(buffer); + } + + private static String receiveMessage(SocketChannel channel) throws IOException { + ByteBuffer buffer = ByteBuffer.allocate(256); + channel.read(buffer); + return new String(buffer.array()).trim(); + } +} -- GitLab