Comme dit, Socket implémente "java.lang.AutoCloseable", donc, en fin de bloc, la méthode "close()" est appellée.
Mais peut-être que l'équipement a besoin de commandes additionnelles... je ne sais pas...
Comme dit, Socket implémente "java.lang.AutoCloseable", donc, en fin de bloc, la méthode "close()" est appellée.
Mais peut-être que l'équipement a besoin de commandes additionnelles... je ne sais pas...
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Salut
Je continue d'avancer sur mon application web et j'aurais une petite question.
Voici l'état de mon appli :
Comme tu peux le voir sur la photo j'ai bien récupéré la réponse de l'automate, elle est traitée pour ensuite afficher une représentation de l'andon(panneau leds).
Le petit soucis c'est que je voudrais que l'ip saisit soit vérifiée pour éviter d'afficher la représentation des fausses adresses. Je ne trouve pas mon bonheur sur le web..
Aurais tu une idée ?
Lorsque tu instancies la classe Socket en lui passant l'adresse IP et le port, tu n'as qu'à traiter l'exception UnknownHostException à part.
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Salut,
Après pas mal de recherche..
J'ai essayé pas mal de choses mais je suis toujours au même niveaux..
Aurais-tu un peu plus d'info a me donner ?
J'ai trouvé quelques choses :
La servlet avec l'exception "result = null;"
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 if (adresse != null) { String result = null; try { result = IPX800V3.test(adresse, 9870); } catch (Exception e) { result = null; } if(result != null) { StringBuilder sb = new StringBuilder(); sb.append("automates.set(\"").append(adresse).append("\", "); System.out.print(result); sb.append("\"").append(result).append("\");"); sb.append("\r\n\r\n"); out.write(sb.toString()); }
et la fonction ajouterAutomate avec le if (automates.get(adresse) != null)
Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 function ajouterAutomate() { var inputField = document.getElementById("automate"); var adresse = inputField.value; if (automates.get(adresse) != null) { automates.set(adresse, "Initialisation en cours... "); } inputField.value = ""; displayData(); setTimeout(getAutomateData, 200, adresse); afficherTab(); }
Cela fonctionne correctement pour le moment mais je ne sais pas si c'est la bonne façon
Suite a mon petit msg voici le code de l'application :
com.automate.bdd : BaseDD
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 package com.automate.bdd; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import com.automate.beans.Utilisateur; public class BaseDD { private Connection connexion; public List<Utilisateur> recupererUtilisateurs() { List<Utilisateur> utilisateurs = new ArrayList<Utilisateur>(); Statement statement = null; ResultSet resultat = null; loadDatabase(); try { statement = connexion.createStatement(); // Exécution de la requête resultat = statement.executeQuery("SELECT IP FROM dbo.Table_automates;\r\n" + ""); // Récupération des données while (resultat.next()) { String IP = resultat.getString("IP"); Utilisateur utilisateur = new Utilisateur(); utilisateur.setIP(IP); utilisateurs.add(utilisateur); } } catch (SQLException e) { } finally { // Fermeture de la connexion try { if (resultat != null) resultat.close(); if (statement != null) statement.close(); if (connexion != null) connexion.close(); } catch (SQLException ignore) { } } return utilisateurs; } private void loadDatabase() { // Chargement du driver try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (ClassNotFoundException e) { } try { connexion = DriverManager.getConnection("jdbc:sqlserver://SPF00035\\SQL;databaseName=IPX;user=sa;password=AdminIPX800"); } catch (SQLException e) { e.printStackTrace(); } } public void ajouterUtilisateur(Utilisateur utilisateur) { loadDatabase(); try { PreparedStatement preparedStatement = connexion.prepareStatement("INSERT INTO dbo.Table_automates (IP, Port, Nom, NbLeds) VALUES (?, ?, ?, ? )"); preparedStatement.setString(1, utilisateur.getIP()); preparedStatement.setString(2, utilisateur.getPort()); preparedStatement.setString(3, utilisateur.getNom()); preparedStatement.setString(4, utilisateur.getNbLeds()); preparedStatement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } }
Un beans :
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 package com.automate.beans; public class Utilisateur { private String IP; private String Port; private String Nom; private String NbLeds; public String getIP() { return IP; } public void setIP(String iP) { IP = iP; } public String getPort() { return Port; } public void setPort(String port) { Port = port; } public String getNom() { return Nom; } public void setNom(String nom) { Nom = nom; } public String getNbLeds() { return NbLeds; } public void setNbLeds(String nbLeds) { NbLeds = nbLeds; } }
Ma servlet GetState :
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 package com.automate.state; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.automate.bdd.BaseDD; @WebServlet(urlPatterns = "/getState") public class GetState extends HttpServlet { private static final long serialVersionUID = 1; @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try ( PrintWriter out = response.getWriter();) { String adresse = request.getParameter("addr"); System.out.println("Extraction de l'état de l'automate " + adresse + " en cours..."); if (adresse != null) { String result = null; try { result = IPX800V3.test(adresse, 9870); } catch (Exception e) { result = null; } if(result != null) { StringBuilder sb = new StringBuilder(); sb.append("automates.set(\"").append(adresse).append("\", "); //System.out.print(result); sb.append("\"").append(result).append("\");"); sb.append("\r\n\r\n"); out.write(sb.toString()); } } System.out.println("Extraction de l'état de l'automate " + adresse + " terminée."); } } }
La classe IPX800V3 :
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package com.automate.state; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class IPX800V3 { public static String test(String adresse, int port) throws Exception { try ( Socket socket = new Socket(adresse, port); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(socket.getOutputStream()); ) { socket.setSoTimeout(500); pw.println("GetOutputs"); pw.flush(); String result; result = br.readLine(); return result; } } }
Et ma page jsp (anciennement index.html) :
Petit rappel j'utilise SQL server. J'aimerais récupéré les IP sur la base pour ensuite les traiter. J'arrive a les afficher dans une page jsp avec des balises JSTL mais je n'arrive pas a les traiter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212 <%@ page pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <style type="text/css"> body { /*background:url("image/andon.png") no-repeat center top;*/ } fieldset { background-color: #F0F7F6; -moz-border-radius:8px; -webkit-border-radius:8px; border-radius:8px; } legend { font-weight : bolder; font-size:larger; margin-bottom:0px; margin-left:10px; } .test { width : 55px; height : 320px; background-color: #030303; border-radius: 10px; } .legend1 { width: 645px; height: 89px; margin-left: 310px; float: left; } .automate { margin-top:15px; margin-bottom:15px; margin-right: 0px; } #table { margin-left: 2px; } </style> <script> var automates = new Map(); function ajouterAutomate() { var inputField = document.getElementById("automate"); var adresse = inputField.value; if (automates.get(adresse) != null) { automates.set(adresse, "Initialisation en cours... "); } inputField.value = ""; displayData(); setTimeout(getAutomateData, 200, adresse); afficherTab(); } function getAutomateData(adresse) { var http = new XMLHttpRequest(); http.open("GET", "/ApplicationWebAutomate/getState?addr=" + adresse, true); http.send(); http.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var response = this.responseText; console.log(response); eval(response); displayData(); afficherTab(); } } } function displayData() { var result = ""; automates.forEach(function(valeur, cle) { result += cle + " = " + valeur + "<br/>"; }); document.getElementById("data").innerHTML = result; //afficherTab(); } function afficherTab() { var result = ""; automates.forEach(function(valeur, cle) { result += "<br>" + cle + " = " + "<br>" + "<br>" + "<div class='test' id='test'>"; //for (var i = 0; i < 5; i++) { if(valeur[4] == 0){ result += "<br>" + "<table id='table' width='50px' height='35px' background-color:#030303>" + "<tbody>" + "<tr>" + "<td style='border-style:30px; border-color:#D9CFCF; background-color:#D9CFCF; opacity: 1;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; // result += "<tr>" + valeur[i] + "<br/>"; } else { result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#FEFCFC; background: radial-gradient(#F9F7B8, #FEFCFC); background-color:#FEFCFC; box-shadow: 0px 0px 11px 4px rgba(237, 245, 100, 0.77);-moz-box-shadow: 0px 0px 11px 4px rgba(237, 245, 100, 0.77);-webkit-box-shadow: 0px 0px 11px 4px #FFFFFF;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; } if(valeur[3] == 0){ result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#82F37A; background-color:#82F37A; opacity: 1;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; // result += "<tr>" + valeur[i] + "<br/>"; } else { result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#0FD501; background: radial-gradient(#FFFFFF, #0FD501); background-color:#0FD501;box-shadow: 0px 0px 11px 4px rgba(15, 213, 1, 0.75);-moz-box-shadow: 0px 0px 11px 4px rgba(15, 213, 1, 0.75);-webkit-box-shadow: 0px 0px 11px 4px rgba(15, 213, 1, 0.75);' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; } if(valeur[2] == 0){ result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#F97878; background-color:#F97878; opacity: 1;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; // result += "<tr>" + valeur[i] + "<br/>"; } else { result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#FE0101; background: radial-gradient(#FFFFFF, #FE0101); background-color:#FE0101; box-shadow=0px 0px 11px 4px rgba(255, 0, 0, 0.88);-moz-box-shadow=0px 0px 11px 4px rgba(255, 0, 0, 0.88);-webkit-box-shadow: 0px 0px 11px 4px rgba(255, 0, 0, 0.88);' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; } if(valeur[1] == 0){ result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#FEDE73; background-color:#FEDE73; opacity: 1;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; // result += "<tr>" + valeur[i] + "<br/>"; } else { result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#FA7E05; background: radial-gradient(#FFFFFF, #FA7E05); background-color:#FA7E05;box-shadow: 0px 0px 11px 4px #fe9901;-moz-box-shadow: 0px 0px 11px 4px #fe9901;-webkit-box-shadow: 0px 0px 11px 4px #fe9901;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>"; } if(valeur[0] == 0){ result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style='border-color:#767AF2; background-color:#767AF2; opacity: 1;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>" + "</div>"; // result += "<tr>" + valeur[i] + "<br/>"; } else { result += "<br>" + "<table id='table' width='50px' height='35px' >" + "<tbody>" + "<tr>" + "<td style=' border-color:#080FF0; background: radial-gradient(#FFFFFF, #080FF0); background-color:#080FF0;box-shadow: 0px 0px 11px 4px #080ff0;-moz-box-shadow: 0px 0px 11px 4px #080ff0;-webkit-box-shadow: 0px 0px 11px 4px #080ff0;' >" + "</td>" + "</tr>" + "</tbody>" + "</table>" + "</div>" ; } }); document.getElementById("data").innerHTML = result; } function reloadData() { automates.forEach(function(valeur, cle) { getAutomateData(cle); afficherTab(); }); } var intervalId = null; function setTimer() { if (intervalId != null) { clearInterval(intervalId); intervalId = null; document.getElementById("cyclique").innerHTML = "Démarrer l'extraction cyclique"; return; } intervalId = setInterval("reloadData()", 5000); document.getElementById("cyclique").innerHTML = "Stopper l'extraction cyclique"; } </script> </head> <body> <div class="legend1"> <form onsubmit="return false"> <fieldset class="connection"> <legend>Simoldes Plasticos France</legend> <div class="automate"> <label for="automate">Adresse automate</label> <input type="text" id="automate" value="<c:out value="${utilisateur.IP}"/>" /> <button onclick="ajouterAutomate()">Ajouter automate</button> <button onclick="setTimer()" id="cyclique">Démarrer l'extraction cyclique</button> <!-- <button onclick="afficherTab()">Afficher tableau</button> --> <div id="data"></div> <c:forEach var="utilisateur" items="${ utilisateurs }"> <li><c:out value="${ utilisateur.IP }" /> </li> </c:forEach> </div> </fieldset> </form> </div> </body> </html>
Tu veux faire le lien avec ceci ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <c:forEach var="utilisateur" items="${ utilisateurs }"> <li><c:out value="${ utilisateur.IP }" /> </li> </c:forEach>
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Non du tout je faisais quelques test pour récupérer une IP et l'afficher. Mais ce n'est pas ce que je souhaite faire.
Je te réexplique :
Actuellement l'application récupère l'ip que l'utilisateur rentre dans le INPUT, creation d'un socket avec l'ip et le port, pour ensuite envoyer une requête a mon automates et en fin faire l'affichage suivant la réponse de l'automate.
J'aimerais maintenant qu'au lieu de devoir rentrer chaque IP (Version final : 26 IPX800), que l'application ce connecte a une BDD qui possède toute les IP de mes automates pour ensuite faire le traitement en arrière plan puis afficher la réponses.
Voici ma table dans ma BDD :
Dans le principe, tu peux t'inspirer de la boucle que tu as fait avec ta variable "utilisateurs".
Tu peux très bien associer un évènement "onclick" sur la balise <li>
Comme ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <script> function process(ip, port, name, leds) { alert('Automate ' + name + ', adresse=' + ip + ':' + port + ', nombre de leds=' + leds); } </script> <style> li{ cursor:pointer; } </style> </head <body> <form onsubmit="return false"> <ul> <c:forEach var="utilisateur" items="${ utilisateurs }"> <li onclick="process('${utilisateur.IP}', '${utilisateur.Port}', '${utilisateur.Nom}', '${utilisateur.NbLeds}')">${utilisateur.Nom}</li> </c:forEach> </ul> </form> </body> </html>
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
J'avais essayé de faire quelques choses de similaires mais javais eu du mal pour les fonction js et ajax (pour qui récupère l'ip et le port) et pour la servlet GetState et la classe BaseDD.
Si je comprend bien ce que tu as fais : tu veux d'abord afficher les IP, Port, Name, NbLeds pour ensuite cliquer sur l'ip voulu et continuer le traitement comme d'habitude ?
Dans ce que je t'ai montré oui, mais je ne sais pas ce que tu voudrais faire au juste, il y a différentes façons de voire les choses.
Là, tu peux sélectionner à partir d'une liste ET ajouter un nouvel automate (je ne sais pas si tu en as le besoin)
Tu pourrais tout autant charger ET extraire toutes les données des automates de ta DB dès le chargement de la page (fonction associée à <body onload="...">) sans avoir de fonction d'ajout
Ou un mixte des 2
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Je voudrais tous charger et extraire les données des automates dès le chargement de la page. Ou comme tu dis avoir une liste de tous les noms d'automates. Pour l'affichage il suffirait de cliquer sur le nom des automates qui nous intéresse pour les afficher.
J'ai donc essayé :
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 package com.automate.servlets; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.automate.beans.Utilisateur; import com.automate.bdd.BaseDD; @WebServlet(urlPatterns = "/getState") public class GetState extends HttpServlet { private static final long serialVersionUID = 1; public GetState() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BaseDD tableNoms = new BaseDD(); request.setAttribute("utilisateurs", tableNoms.recupererUtilisateurs()); this.getServletContext().getRequestDispatcher("/WEB-INF/bonjour.jsp").forward(request, response); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try ( PrintWriter out = response.getWriter();) { String adresse = request.getParameter("utilisateurs"); System.out.println("Extraction de l'état de l'automate " + adresse + " en cours..."); if (adresse != null) { String result = null; try { result = IPX800V3.test(adresse, 9870); } catch (Exception e) { result = null; } if(result != null) { StringBuilder sb = new StringBuilder(); sb.append("automates.set(\"").append(adresse).append("\", "); //System.out.print(result); sb.append("\"").append(result).append("\");"); sb.append("\r\n\r\n"); out.write(sb.toString()); } } System.out.println("Extraction de l'état de l'automate " + adresse + " terminée."); } } }
Parait-elle correcte ? Lors du chargement de la page la méthode service s’exécute avec comme adresse null et je reste sur une page blanche. Je voudrais que d'abord cela ce connecte sur la bdd, qu'elle récupère les IP/Port/Nom/NbLeds, qu'elle les affiche sur ma page ensuite il suffirait de cliquer sur le nom de l'automate par exemple pour envoyer la requête a l'automate et faire l'affichage. Je ne souhaite pas ajouter de nouveaux Automates a ma bdd.
Avec une servlet, soit tu codes la méthode service qui répond à tout type de requête, soit tu code doGet et/ou doPost pour répondre respectivement à une requête get (url) ou une requête post (formulaire).
Dans tous les cas, ce n'est pas une super idée de faire une servlet qui fait 2 choses différentes, il serait peut-être judicieux d'en faire 2 :
1- extraction de la liste à partir de la DB
2- extraction de l'état d'un automate
Au niveau de la page, il faudrait récupérer la liste des automates dans la méthode liée à "unload" sous forme de liste d'objets javascript et boucler sur la liste pour appeler l'autre servlet qui extrait l'état.
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
D'accord, je vais donc faire 2 servlets.
J'ai modifié aussi les fonctions javascript et la fonction ajax.
Cela fonctionne pour le moment
Bonjour,
Je suis en train de continuer de développer tranquillement mon application, j'aurais encore une petite question
Je m'explique :
J'ai maintenant une page jsp qui récupère les infos de ma base de données et les affiche ensuite.
Le traitement des données ce fait après l'affichage. J'aimerais tester la connexion avant l'affichage, car pour le moment la page affiche tous les automates présent sur la table sans savoir si l'automate est fonctionnel. Pour le moment je récupère l'ip par javascript depuis la page d'affichage.
Je ne sais pas trop sur quoi me diriger.
Merci d'avance.
Cordialement
Je ne pense pas que ce soit une bonne idée de tester avant l'affichage de la page parce que tu vas introduire des latences qui peuvent être longues en ouvrant le socket vers tes automates.
Le mieux, je pense, serait de désactiver les automates qui ne répondent pas (ou les effacer) en conservant le principe actuel...
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
De mon point de vue, le mieux est de continuer avec les requêtes ajax.
A la limite, tu pourrais jouer sur le temps d'attente entre 2 requêtes. Si un automate ne répond pas, il n'est peut-être pas nécessaire d'envoyer une requête toutes les 15 secondes
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager