Skip to content

Commit

Permalink
Merge pull request #5 from matthieu637/master
Browse files Browse the repository at this point in the history
MAJ fork
  • Loading branch information
david540 authored Feb 26, 2017
2 parents efa219b + 2824952 commit ceac376
Show file tree
Hide file tree
Showing 11 changed files with 83 additions and 64 deletions.
4 changes: 3 additions & 1 deletion 2017/SimBourse/src/core/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ public class Config {
public final int PORT = 23456; //23456 ou 80
public final int TEMPS_PARTIE = 10;//en minutes
public final int PACKET_SIZE = 8;
public final int MAX_PACKET_SIZE_INPUT = 128;
public final int RESERVED_SIZE_SEND_PACKET = (int) (Math.pow(10, PACKET_SIZE)-1);
public final boolean BANQUE = true;
public final String CHEMIN_FICHIER="OperationsHistorique.txt";
public final String VERSION = "1.2";
public final String VERSION = "1.3";

private Config (){

Expand Down
11 changes: 5 additions & 6 deletions 2017/SimBourse/src/network/Client.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package network;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
Expand Down Expand Up @@ -52,8 +51,8 @@ public void run() {
int numero_partie = -1;
boolean create = false;
try {
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()), Config.getInstance().MAX_PACKET_SIZE_INPUT);
OutputStreamWriter out = new OutputStreamWriter(client.getOutputStream());

envoyer(out, Config.getInstance().VERSION);
String userInput;
Expand Down Expand Up @@ -103,7 +102,7 @@ public void run() {
String retour = current.getMarche().getListeJoueursString();
for (Socket s : current.getListe_client())
if (s != client) {
BufferedWriter outAdvers = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
OutputStreamWriter outAdvers = new OutputStreamWriter(s.getOutputStream());
envoyer(outAdvers, "0");
}
envoyer(out, retour);
Expand Down Expand Up @@ -220,10 +219,10 @@ else if(arguments.length == 3 && StringUtils.isNumeric(arguments[1]) && StringUt

}

private void envoyer(BufferedWriter out, String packet) throws IOException {
private void envoyer(OutputStreamWriter out, String packet) throws IOException {
StringBuilder length = new StringBuilder(Config.getInstance().PACKET_SIZE);
String llength = String.valueOf(packet.length());
if(packet.length() > 99999){
if(packet.length() > Config.getInstance().RESERVED_SIZE_SEND_PACKET){
System.out.println("ERROR : packet too small");
System.err.println("ERROR : packet too small");
}
Expand Down
33 changes: 27 additions & 6 deletions 2017/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ def __init__(self, host="matthieu-zimmer.net", port=23456):
self.__topbool = False
self.__histoActions={}
self.__tempsFinPartie= 0
self.__versionClient="1.2"
self.__versionClient="1.4"
self.__sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#connexion
self.__sock.settimeout(5)
Expand Down Expand Up @@ -129,10 +129,23 @@ def __recevoir(self):
length = self.__sock.recv(8)
if length == b'':
raise RuntimeError("Connexion perdu. _5")
back = self.__sock.recv(int(length.decode()))
if back == b'':
raise RuntimeError("Connexion perdu. _3")
return back.decode()
length=int(length.decode())
result=''
while True:
keep = length - len(result)
if keep > 4096:
back = self.__sock.recv(4096)
if back == b'':
raise RuntimeError("Connexion perdu. _3")
result += back.decode()
else:
back = self.__sock.recv(keep)
if back == b'':
raise RuntimeError("Connexion perdu. _6")
result += back.decode()
break

return result
except (ConnectionRefusedError):
raise RuntimeError("Connexion perdu. _4")

Expand All @@ -154,7 +167,7 @@ def creerPartie(self, nom):
>>> print(id)
31416 #id de la partie
En cas d'erreur(Exemple pseudo avec des espaces):
Renvoie -4
Renvoie -4
@param nom: le nom du joueur qui cree la partie
@type nom: string
Expand Down Expand Up @@ -221,6 +234,7 @@ def solde(self):
Renvoie un dictionnaire (string:entier).
Exemple:
>>> r.solde()
{'Apple': 100, 'Facebook': 100, 'Google': 100, 'Trydea': 100, 'euros': 1000}
'''
Expand Down Expand Up @@ -311,9 +325,12 @@ def achats(self, action, nbMaxElemListe=0):
Exemple:
>>> r.achats("Trydea")
[('Matthieu', 23,15), ('Ryan',20,10), ('Paul', 17,23)]
r.achats("Trydea", 5)
@param action: le nom de l'action pour laquelle vous voulez voir les offres d'achats
@type action: string
@param nbMaxElemListe : argument facultatif
@type nbMaxElemListe: entier
'''
action=action.lower()
self.__estTop()
Expand Down Expand Up @@ -343,9 +360,13 @@ def ventes(self, action, nbMaxElemListe=0):
Exemple:
>>> r.ventes('Facebook')
[('Matthieu', 5.0, 5), ('banque', 25.0, 40000)]
r.ventes('Facebook', 5)
@param action: nom de l'action
@type action: string
@param nbMaxElemListe : argument facultatif
@type nbMaxElemListe: entier
'''
action=action.lower()
self.__estTop()
Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,12 @@ Puisque les nouvelles commandes que vous avez ajoutées ne seront pas directemen
- [x] * [ajouter une fonction listeDesCoups() ne pouvant être appellé qu'une fois la partie terminée. Elle listera l'ensemble des coups (achat, ventes, annulation) que tous les joueurs ont envoyés durant une partie. Cela permettra d'apprendre de ses erreurs et potentiellement d'appliquer des techniques d'apprentissages statistiques sur ces données.](https://github.com/matthieu637/cpp-2a-info/pull/7) (client+serveur) terminée par [david540](https://github.com/david540)
- [x] * [faire écrire au serveur la liste des coups de l'ensemble des parties dans un fichier qui pourra être ensuite distribué aux étudiants (serveur)](https://github.com/matthieu637/cpp-2a-info/pull/12) terminée par [david540](https://github.com/david540)
- [ ] ne logger que les parties qui contiennent plus d'un joueur, ajouter le classement de fin de partie aux logs. Ajouter un champ "temps depuis debut de la partie" à la classe core.Operation et aux logs. Format : {'coups': ListeDesCoups, 'classement' : ListeClassement}. (serveur)
- [ ] ajouter un argument facultatif pour limiter la taille des listes reçues dans achats et ventes afin de diminuer la taille des messages réseaux. Exemple : r.ventes('Facebook', 5) (client+serveur)
- [ ] faire des statistiques sur le nombre de requête reçu par minute sur les parties avec leur type. Vérifier qu'un utilisateur ne puisse pas saturer et monopoliser le serveur pour lui-même. Enregistrer le tout dans un fichier. (serveur)
- [ ] définir un nombre limite de requête par seconde pour chaque utilisateur (serveur)
- [x] [ajouter un argument facultatif pour limiter la taille des listes reçues dans achats et ventes afin de diminuer la taille des messages réseaux. Exemple : r.ventes('Facebook', 5)](https://github.com/matthieu637/cpp-2a-info/pull/14) (client+serveur) terminée par [david540](https://github.com/david540)
- [x] [ajouter un cache pour la fonction historique pour réduire la taille de la liste à passer au réseau (client+serveur)](https://github.com/matthieu637/cpp-2a-info/pull/2) ([idée émise](https://github.com/matthieu637/cpp-2a-info/pull/1) et terminée par [david540](https://github.com/david540))
- [ ] réduire la taille des messages réseaux en codant le nom des joueurs par des nombres. La première fois qu'un nom est envoyé sur le réseau, il est écrit en clair, les prochains fois, seul un nombre le représentera. (client+serveur)
- [ ] optimiser le protocol réseau d'envoie des données du serveur vers le client. Actuellement 8 caractères sont envoyés en début de requête pour prévenir de la taille de la requête (maximum 99999999). Utiliser des bytes pour représenter la taille de la requête à la place de chaînes peut faire gagner en temps. (client+serveur)
- [ ] rendre le traitement des requêtes réseaux optimal. Passage de O(n) à O(1) en remplacant la succession de comparaison de chaîne par un accès direct dans un tableau : idée similaire à l'optimisation qui a eu lieu pour les actions. Exemple : Create est dans la case 0 du tableau, JOIN est la case 1, ... Il faut créer autant de classe qu'il y a de requêtes différentes, utiliser le polymorphisme, ... (serveur)

Pour les contributions suivantes (les plus difficiles), il est inutile, pour le moment, d'implémenter uniquement ces fonctions dans le client (avec de multiples requêtes au serveur). L'intérêt étant qu'elles soient justement exécutées au plus vite du côté serveur avant les autres requêtes. Si elles ne sont pas terminées avant la compétition, chaque étudiant pourra alors décider de les implémenter du côté de son client (pas besoin de partager votre solution).
Expand Down
2 changes: 1 addition & 1 deletion docs/class-tree.html
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ <h1 class="epydoc">Class Hierarchy</h1>
<table border="0" cellpadding="0" cellspacing="0" width="100%%">
<tr>
<td align="left" class="footer">
Generated by Epydoc 3.0.1 on Fri Feb 24 12:12:34 2017
Generated by Epydoc 3.0.1 on Sun Feb 26 14:07:15 2017
</td>
<td align="right" class="footer">
<a target="mainFrame" href="http://epydoc.sourceforge.net"
Expand Down
2 changes: 1 addition & 1 deletion docs/client-module.html
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ <h1 class="epydoc">Module client</h1><p class="nomargin-top"></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%%">
<tr>
<td align="left" class="footer">
Generated by Epydoc 3.0.1 on Fri Feb 24 12:12:34 2017
Generated by Epydoc 3.0.1 on Sun Feb 26 14:07:15 2017
</td>
<td align="right" class="footer">
<a target="mainFrame" href="http://epydoc.sourceforge.net"
Expand Down
82 changes: 38 additions & 44 deletions docs/client.Reseau-class.html
Original file line number Diff line number Diff line change
Expand Up @@ -305,9 +305,10 @@ <h1 class="heading">Informations sur le classement final</h1>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td><span class="summary-sig"><a href="client.Reseau-class.html#achats" class="summary-sig-name">achats</a>(<span class="summary-sig-arg">self</span>,
<span class="summary-sig-arg">action</span>)</span><br />
Liste tous les ordres d&#8217;achats pour tous les joueurs sur une action
donn&#233;e.</td>
<span class="summary-sig-arg">action</span>,
<span class="summary-sig-arg">nbMaxElemListe</span>=<span class="summary-sig-default">0</span>)</span><br />
Liste tous les ordres d&#8217;achats avec nbMaxElemListe element de liste
pour tous les joueurs sur une action donn&#233;e.</td>
<td align="right" valign="top">


Expand All @@ -324,7 +325,8 @@ <h1 class="heading">Informations sur le classement final</h1>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td><span class="summary-sig"><a href="client.Reseau-class.html#ventes" class="summary-sig-name">ventes</a>(<span class="summary-sig-arg">self</span>,
<span class="summary-sig-arg">action</span>)</span><br />
<span class="summary-sig-arg">action</span>,
<span class="summary-sig-arg">nbMaxElemListe</span>=<span class="summary-sig-default">0</span>)</span><br />
Liste tous les ordres de ventes ouverts de tous les utilisateurs pour
une action donnee.</td>
<td align="right" valign="top">
Expand Down Expand Up @@ -459,11 +461,10 @@ <h3 class="epydoc"><span class="sig"><span class="sig-name">creerPartie</span>(<
</tr></table>

<p>Cr&#233;e la partie et renvoie l&#8217;id &#224; communiqur oralement aux autres
joueurs. Exemple:</p>
<pre class="py-doctest">
<span class="py-prompt">&gt;&gt;&gt; </span>id=r.creerPartie(<span class="py-string">&quot;MatthieuDevall&#233;&quot;</span>)
<span class="py-prompt">&gt;&gt;&gt; </span><span class="py-keyword">print</span>(id)
<span class="py-output">31416 #id de la partie</span></pre>
joueurs.</p>
<p>Exemple: &gt;&gt;&gt; id=r.creerPartie(&quot;MatthieuDevall&#233;&quot;)
&gt;&gt;&gt; print(id) 31416 #id de la partie En cas d'erreur(Exemple
pseudo avec des espaces): Renvoie -4</p>
<dl class="fields">
<dt>Parameters:</dt>
<dd><ul class="nomargin-top">
Expand Down Expand Up @@ -578,10 +579,7 @@ <h3 class="epydoc"><span class="sig"><span class="sig-name">operationsEnCours</s
<p>Retourne une liste d&#8217;entiers, qui correspondent aux identifiants des
ordres pr&#233;c&#233;demment transmis et qui ne sont pas encore termin&#233;s: on peut
donc les suivre et les annuler.</p>
<p>Exemple:</p>
<pre class="py-doctest">
<span class="py-prompt">&gt;&gt;&gt; </span>R.operationsEnCours()
<span class="py-output">[62098581, 20555477]</span></pre>
<p>Exemple: &gt;&gt;&gt; R.operationsEnCours() [62098581, 20555477]</p>
<dl class="fields">
</dl>
</td></tr></table>
Expand Down Expand Up @@ -694,15 +692,17 @@ <h3 class="epydoc"><span class="sig"><span class="sig-name">bid</span>(<span cla
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr valign="top"><td>
<h3 class="epydoc"><span class="sig"><span class="sig-name">achats</span>(<span class="sig-arg">self</span>,
<span class="sig-arg">action</span>)</span>
<span class="sig-arg">action</span>,
<span class="sig-arg">nbMaxElemListe</span>=<span class="sig-default">0</span>)</span>
</h3>
</td><td align="right" valign="top"
>&nbsp;
</td>
</tr></table>

<p>Liste tous les ordres d&#8217;achats pour tous les joueurs sur une action
donn&#233;e. Retourne:</p>
<p>Liste tous les ordres d&#8217;achats avec nbMaxElemListe element de liste
pour tous les joueurs sur une action donn&#233;e. Pour pas de limite
d'&#233;l&#233;ments de liste, mettre nbMaxElemListe=0 Retourne:</p>
<ul>
<li>
-4 si l&#8217;action n&#8217;existe pas
Expand All @@ -712,15 +712,15 @@ <h3 class="epydoc"><span class="sig"><span class="sig-name">achats</span>(<span
<code>(nom_acheteur, prix, volume)</code>
</li>
</ul>
<p>Exemple:</p>
<pre class="py-doctest">
<span class="py-prompt">&gt;&gt;&gt; </span>r.achats(<span class="py-string">&quot;Trydea&quot;</span>)
<span class="py-output">[('Matthieu', 23,15), ('Ryan',20,10), ('Paul', 17,23)]</span></pre>
<p>Exemple: &gt;&gt;&gt; r.achats(&quot;Trydea&quot;) [('Matthieu',
23,15), ('Ryan',20,10), ('Paul', 17,23)] r.achats(&quot;Trydea&quot;,
5)</p>
<dl class="fields">
<dt>Parameters:</dt>
<dd><ul class="nomargin-top">
<li><strong class="pname"><code>action</code></strong> (string) - le nom de l'action pour laquelle vous voulez voir les offres
d'achats</li>
<li><strong class="pname"><code>nbMaxElemListe</code></strong> (entier) - argument facultatif</li>
</ul></dd>
</dl>
</td></tr></table>
Expand All @@ -733,17 +733,19 @@ <h3 class="epydoc"><span class="sig"><span class="sig-name">achats</span>(<span
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr valign="top"><td>
<h3 class="epydoc"><span class="sig"><span class="sig-name">ventes</span>(<span class="sig-arg">self</span>,
<span class="sig-arg">action</span>)</span>
<span class="sig-arg">action</span>,
<span class="sig-arg">nbMaxElemListe</span>=<span class="sig-default">0</span>)</span>
</h3>
</td><td align="right" valign="top"
>&nbsp;
</td>
</tr></table>

<p>Liste tous les ordres de ventes ouverts de tous les utilisateurs pour
une action donnee. Renvoie une liste de tuple (nom_acheteur, prix,
volume) triee par le prix le plus avantageux. Si l'action n'existe pas
renvoie -4;</p>
une action donnee. Pour pas de limite d'&#233;l&#233;ments de liste, mettre
nbMaxElemListe=0 Renvoie une liste de tuple (nom_acheteur, prix, volume)
triee par le prix le plus avantageux. Si l'action n'existe pas renvoie
-4;</p>
<p>Retourne:</p>
<ul>
<li>
Expand All @@ -754,14 +756,13 @@ <h3 class="epydoc"><span class="sig"><span class="sig-name">ventes</span>(<span
<code>(nom_acheteur, prix, volume)</code>
</li>
</ul>
<p>Exemple:</p>
<pre class="py-doctest">
<span class="py-prompt">&gt;&gt;&gt; </span>r.ventes(<span class="py-string">'Facebook'</span>)
<span class="py-output">[('Matthieu', 5.0, 5), ('banque', 25.0, 40000)]</span></pre>
<p>Exemple: &gt;&gt;&gt; r.ventes('Facebook') [('Matthieu', 5.0, 5),
('banque', 25.0, 40000)] r.ventes('Facebook', 5)</p>
<dl class="fields">
<dt>Parameters:</dt>
<dd><ul class="nomargin-top">
<li><strong class="pname"><code>action</code></strong> (string) - nom de l'action</li>
<li><strong class="pname"><code>nbMaxElemListe</code></strong> (entier) - argument facultatif</li>
</ul></dd>
</dl>
</td></tr></table>
Expand All @@ -784,10 +785,9 @@ <h3 class="epydoc"><span class="sig"><span class="sig-name">historiques</span>(<
<p>Permet de lister tous les &#233;changes d&#233;j&#224; effectu&#233;s sur une action.
Retourne une liste de tuples tri&#233;e par ordre chronologique. Sous la
forme: <code>(nom_vendeur, nom_acheteur, prix, volume)</code></p>
<p>Exemple:</p>
<pre class="py-doctest">
<span class="py-prompt">&gt;&gt;&gt; </span>r.historiques(<span class="py-string">&quot;Trydea&quot;</span>)
<span class="py-output">[('Matthieu','Mukhlis',10,10), ('T&#233;rence', 'Ryan', 15,20), ('Matthieu', 'Ryan', 20,3)]</span></pre>
<p>Exemple: &gt;&gt;&gt; r.historiques(&quot;Trydea&quot;)
[('Matthieu','Mukhlis',10,10), ('T&#233;rence', 'Ryan', 15,20), ('Matthieu',
'Ryan', 20,3)]</p>
<dl class="fields">
<dt>Parameters:</dt>
<dd><ul class="nomargin-top">
Expand Down Expand Up @@ -865,9 +865,7 @@ <h3 class="epydoc"><span class="sig"><span class="sig-name">annulerOperation</sp
les euros d&#233;pens&#233;s si c&#8217;est ordre d&#8217;achat
</li>
</ul>
<p>Exemple:</p>
<pre class="py-doctest">
<span class="py-prompt">&gt;&gt;&gt; </span>r.annulerOrdre(31416)</pre>
<p>Exemple: &gt;&gt;&gt; r.annulerOrdre(31416)</p>
<dl class="fields">
<dt>Parameters:</dt>
<dd><ul class="nomargin-top">
Expand All @@ -894,14 +892,10 @@ <h3 class="epydoc"><span class="sig"><span class="sig-name">fin</span>(<span cla
<p>Renvoie un dictionnaire le temps restant (en s) avant la fin de la
partie (string:entier). Si la partie est termin&#233;e, affiche le classement
(string:liste).</p>
<p>Exemple:</p>
<pre class="py-doctest">
<span class="py-prompt">&gt;&gt;&gt; </span>r.fin()
<span class="py-output">{'temps': 10} #Il reste 10 secondes avant la fin de la partie.</span></pre>
<p>OU</p>
<pre class="py-doctest">
<span class="py-prompt">&gt;&gt;&gt; </span>r.fin()
<span class="py-output">{'classement': ['Matthieu', 'Eshamuddin','banque'], 'temps': 0} #Le classement de fin de partie.</span></pre>
<p>Exemple: &gt;&gt;&gt; r.fin() {'temps': 10} #Il reste 10 secondes
avant la fin de la partie.</p>
<p>OU &gt;&gt;&gt; r.fin() {'classement': ['Matthieu',
'Eshamuddin','banque'], 'temps': 0} #Le classement de fin de partie.</p>
<dl class="fields">
</dl>
</td></tr></table>
Expand Down Expand Up @@ -933,7 +927,7 @@ <h3 class="epydoc"><span class="sig"><span class="sig-name">fin</span>(<span cla
<table border="0" cellpadding="0" cellspacing="0" width="100%%">
<tr>
<td align="left" class="footer">
Generated by Epydoc 3.0.1 on Fri Feb 24 12:12:34 2017
Generated by Epydoc 3.0.1 on Sun Feb 26 14:07:15 2017
</td>
<td align="right" class="footer">
<a target="mainFrame" href="http://epydoc.sourceforge.net"
Expand Down
2 changes: 1 addition & 1 deletion docs/help.html
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ <h2> The Navigation Bar </h2>
<table border="0" cellpadding="0" cellspacing="0" width="100%%">
<tr>
<td align="left" class="footer">
Generated by Epydoc 3.0.1 on Fri Feb 24 12:12:34 2017
Generated by Epydoc 3.0.1 on Sun Feb 26 14:07:15 2017
</td>
<td align="right" class="footer">
<a target="mainFrame" href="http://epydoc.sourceforge.net"
Expand Down
2 changes: 1 addition & 1 deletion docs/identifier-index.html
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ <h1 class="epydoc">Identifier Index</h1>
<table border="0" cellpadding="0" cellspacing="0" width="100%%">
<tr>
<td align="left" class="footer">
Generated by Epydoc 3.0.1 on Fri Feb 24 12:12:34 2017
Generated by Epydoc 3.0.1 on Sun Feb 26 14:07:15 2017
</td>
<td align="right" class="footer">
<a target="mainFrame" href="http://epydoc.sourceforge.net"
Expand Down
2 changes: 1 addition & 1 deletion docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ <h1 class="epydoc">Module client</h1><p class="nomargin-top"></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%%">
<tr>
<td align="left" class="footer">
Generated by Epydoc 3.0.1 on Fri Feb 24 12:12:34 2017
Generated by Epydoc 3.0.1 on Sun Feb 26 14:07:15 2017
</td>
<td align="right" class="footer">
<a target="mainFrame" href="http://epydoc.sourceforge.net"
Expand Down
Loading

0 comments on commit ceac376

Please sign in to comment.