#1 Le 21/05/2007, à 15:15
- Rodriguez
[Java]Rapatrier des données avec des requêtes HTTP à intervalle
Bonjour,
Dans le cadre d’un stage, on me demande d’automatiser la création de graphe pour pouvoir faire ça en temps réel.
Voici les infos dont je dispose :
Le serveur qui héberge Magic (SDE) est un serveur NT
L'application est une application WEB sous IIS
Les données sont stockées dans une base SQL serveur.
Les statistiques sont soit gérées par l'application elle-même, soit extraites via Cristal Report.
Je voudrai savoir comment faire pour rapatrier les données en émettant des requêtes http à intervalles de temps régulier.
Merci
Hors ligne
#2 Le 21/05/2007, à 17:43
- obiwankennedy
Re : [Java]Rapatrier des données avec des requêtes HTTP à intervalle
public void connexion() {
Socket s;
try {
s = new Socket(hostname,port);
InputStream sin = s.getInputStream();
fromServer = new BufferedReader(new InputStreamReader(sin));
OutputStream sout = s.getOutputStream();
PrintWriter toServer = new PrintWriter(new OutputStreamWriter(sout));
toServer.print("GET "+FICHIER_QUE_JE_VEUX+" HTTP/1.1\nHost: "+hostname+"\n\n");
toServer.flush();
afficher();
toServer.close();
fromServer.close();
s.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Voici le code d'une fonction qui envoie une requête pour obtenir "FICHIER_QUE_JE_VEUX" ensuite si tu dois passer des éléments en post ou get voit du coté du protocole http.
Sinon dans la méthode.
afficher();
j'ai uniquement un truc comme ça
for(String l = null;(l = fromServer.readLine())!=null;){
System.out.println(l);//affiche toutes les liens de la pages web + le header(16 premieres lignes)
}
c'est pratique pour un fichier texte ensuite si c'est un fichier binaire que tu désires voici le code d'une méthode qui télécharge un fichier.
public void telechargement(){
parent.setmax_jpt(monvector.size());
int taille=0;
int recu=0;
String montable[];
String lefichier;
try {
for(int i = 0;i<monvector.size();i++)
{
FileOutputStream out;
FileChannel file;
SocketChannel socket = SocketChannel.open(new InetSocketAddress(hostname,port));
Charset charset = Charset.forName("ISO-8859-1");
Socket s2;
s2 = new Socket(hostname,port);
InputStream sin2;
BufferedReader fromServer2;
OutputStream sout2;
PrintWriter toServer2;
parent.setvalue_jpt(i+1);
sin2 = s2.getInputStream();
lefichier = monvector.elementAt(i);
socket.write(charset.encode(CharBuffer.wrap("GET "+repertoire+lefichier+" HTTP/1.1\nHost: "+hostname+"\n\n")));
sout2 = s2.getOutputStream();
toServer2 = new PrintWriter(new OutputStreamWriter(sout2));
toServer2.print("HEAD "+repertoire+lefichier+" HTTP/1.1\nHost: "+hostname+"\n\n");
toServer2.flush();
montable=null;
taille=0;
recu=0;
fromServer2 = new BufferedReader(new InputStreamReader(sin2));
for(String l = null;(l = fromServer2.readLine())!=null;){
montable=l.split(" ");
if(montable[0].equals("Content-Length:")){
try{
taille = Integer.parseInt(montable[1]);
}
catch(NumberFormatException e){
System.out.println("petit probleme");
}
}
}
lefichier=lefichier.replace("%20", " ");
parent.setFichier(lefichier);
out = new FileOutputStream(dossier+"\\"+lefichier);
file = out.getChannel();
System.out.println(file.size()+" "+taille);
int a = 1024*1024;
ByteBuffer monbuffer = ByteBuffer.allocateDirect(a);
if(taille!=0){
System.out.println("taille = "+taille);
parent.setmax_jpb(taille);
recu=0;
}
int s=socket.read(monbuffer);
while(s!=-1 || monbuffer.position()>0)
{
if(recu!=-1)
{
recu+=s;
System.out.println("recu = "+recu);
parent.setvalue_jpb(recu);
}
monbuffer.flip();
file.write(monbuffer);
monbuffer.compact();
s=socket.read(monbuffer);
}
file.close();
out.close();
socket.close();
}
parent.setvalue_jpb(0);
parent.setvalue_jpt(0);
parent.messageerreur("Tous les fichiers sont télécharger");
}
catch (Exception e)
{
e.printStackTrace();
}
}
parent dans mon exemple est une JFrame qui affiche des barres de progression du téléchargement donc ne t'en occupes pas.
Voilà.
j'espere que ça t'aidera.
j'ai développé cette classe pour télécharger depuis un serveur web tous les mp3 d'une pages.
Dernière modification par obiwankennedy (Le 21/05/2007, à 17:49)
Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam
Hors ligne
#3 Le 21/05/2007, à 22:00
- Rodriguez
Re : [Java]Rapatrier des données avec des requêtes HTTP à intervalle
Merci pour le code.
Est-ce que tu pourrais m'indiquer si ce que je raconte est correcte et m'indiquer les réponses au question que je me pose pour bien comprendre comment ça se passe.
Donc l'idée, c'est de me connecter à une page web qui donne accès au serveur. Il faut donc que je sache qu'elle est cette page web. Et pour le n° de port ?
Une fois connecté sur le serveur, je récupère le(s) fichier(s) dont j'ai besoin. C'est forcé de récupérer un fichier ?
Pour ce qui est de faire du temps réel, il faut donc que je récupere les fichiers à intervalles de temps réguliers. Quelle est la méthode qui permet de faire ça ?
Merci d'avance.
Hors ligne
#4 Le 21/05/2007, à 22:10
- gdoumenc
Re : [Java]Rapatrier des données avec des requêtes HTTP à intervalle
tu te fais un javascript qui relance le get a intervalle régulier et la page est ce que tu veux (asp, ..)
Hors ligne
#5 Le 22/05/2007, à 08:54
- obiwankennedy
Re : [Java]Rapatrier des données avec des requêtes HTTP à intervalle
Je suppose que les données que tu dois récupérer sont dans un fichier (vu qu'un serveur http ne fait qu'envoyer des fichiers aux clients )
exemple : tu tapes "www.monsite.com/index.html" ton navigateur va télécharger le fichier /index.html du serveur www.monsite.com et il te l'affiche tu peux ensuite naviguer dessus.
donc moi ma première méthode parcoure un résultat et affiche chaque ligne de celui ci.
sinon je télécharge et j'enregistre le fichier sur mon pc.
donc tu n'es pas obligé d'enregistrer le résultat de ta requête sur le poste qui exécute ton programme. il te suffit n'analyser la réponse et de créer tes diagrammes et autres à la volée.
Pour effectuer a intervalle régulier regarde du coté du Timer dans la javadoc.
le numéro de port du protocole http est le 80.
Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam
Hors ligne