asrd
Messages postés43Date d'inscriptionjeudi 21 septembre 2006StatutMembreDernière intervention10 mai 2007
-
26 avril 2007 à 14:50
asrd
Messages postés43Date d'inscriptionjeudi 21 septembre 2006StatutMembreDernière intervention10 mai 2007
-
3 mai 2007 à 17:40
Bonjours a tous, je suis en train de mettre au point un serveur http.
Pour l'instant, voilà ou j'en suis :
1. Je démarre le serveur http
2. J'entre l'adresse ip de la machine sur lequel tourne le serveur
3. Le programme reçoit la requête get et l'affiche dans la console.
Pour écouter le port 80, j'ai utilisé un TCPListener et une Socket.
Ce qui me manque c'est la solution pour pouvoir renvoyer au client le fichier demandé.
J'arrive a identifier le fichier qu'il veut(par ex. membres/accueil.htm) mais pas à le lui renvoyer.
asrd
Messages postés43Date d'inscriptionjeudi 21 septembre 2006StatutMembreDernière intervention10 mai 2007 29 avril 2007 à 19:15
merci pour ta réponse, j'ai en effet regardé ca, mais il me semble que comme son nom l'indique, HTTPListener est fait pour écouter un port http. Je n'ai donc rien trouvé pour envoyer la réponse au client.
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 29 avril 2007 à 22:08
Petit exemple basic:
using System.Net;
using System.Threading;
private HttpListener hl;
AutoResetEvent listenForNextRequest = new AutoResetEvent(false);
private void Start()
{
hl = new HttpListener();
hl.Prefixes.Add("http://+:3000/"); // On veut recevoir les données sur toutes les interfaces pour le port 80
hl.IgnoreWriteExceptions = true;
hl.Start();
ThreadPool.QueueUserWorkItem(new WaitCallback(ListenHTTP));
}
private static void ListenerCallback(IAsyncResult ar)
{
HttpListener listener = ar.AsyncState as System.Net.HttpListener;
System.Net.HttpListenerContext context = null;
if (listener == null) return;
try
{
context = listener.EndGetContext(ar); // Récupère la demande du client
}
catch //(Exception ex)
{
return;
}
finally
{
listenForNextRequest.Set(); // On indique que l'on peut attendre un autre client en asynchrone
}
string file = context.Request.Url.LocalPath.ToString(); // Traitement de la demande
HttpListenerResponse hlr = context.Response;
// On transmet la réponse en écrivant directement sur le flux donnée
hlr.ContentType = "text/html";
FileStream fs = File.OpenRead("html/"+file);
byte[] Tampon = new Byte[512];
int b_read = 0;
while ((b_read = fs.Read(Tampon, 0, 512)) > 0)
hlr.OutputStream.Write(Tampon, 0, b_read);
fs.Close();
// ferme le flux de sortie et envoi les données
hlr.OutputStream.Close();
asrd
Messages postés43Date d'inscriptionjeudi 21 septembre 2006StatutMembreDernière intervention10 mai 2007 30 avril 2007 à 08:36
Enfaite moi je n'utilise pas un HttpListener mais un TCPListener.
J'arrive presque à renvoyer un message au client mais il y a encore un petit truck qui bloque.
Je ne sais pas sous quelle forme envoyer le message.
byte[] msg = Encoding.UTF8.GetBytes("......................................................");
int i = serverSocket.Send(msg);
Console.WriteLine("BYTES ENVOYES: {0} bytes", i);
Il affiche bien le nombre de bytes envoyés dans la console, donc je pense qu'il l'envoi, mais rien ne s'affiche dans l'explorer de mon client.
cs_wizad
Messages postés355Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention14 avril 2009 30 avril 2007 à 08:53
C'est pour ça que HTTPListener est plus pratique : il te simplifie la création de la réponse. Ton problème avec TCP listener semble provenir d'une erreur de protocole... en-tête, format de la réponse,...
La norme http est trés précise tant au niveau client que serveur. La moindre erreur peut empecher ton système de fonctionner. Si tu persiste sur TCPListener je t'invite à vérifier que tu utilise correctement le protocole ici : http://fr.wikipedia.org/wiki/Http
asrd
Messages postés43Date d'inscriptionjeudi 21 septembre 2006StatutMembreDernière intervention10 mai 2007 30 avril 2007 à 09:17
merci pour cette réponse, je pense en effet persister sur le tcpListener.
Je suis allé voir sur wiki, j'ai trouver qu'il faut envoyer le message sous cette syntaxe :
HTTP/1.0 200 OK
Date: Fri, 31 Dec 1999 23:59:59 GMT
Server: Apache/0.8.4
Content-Type: text/html
Content-Length: 59
Expires: Sat, 01 Jan 2000 00:59:59 GMT
Last-modified: Fri, 09 Aug 1996 14:21:40 GMT
<TITLE>Example</TITLE>
Ceci est une page d'exemple.
Mais comment faire pour tout mettre dans une variable?
J'ai testé et ca fonctionne sous firefox, SUPER. Mais ca ne fonctionne pas sous internet explorer. Sais-tu pourquoi?
Les en-têtes sont différentes d'un navigateur à l'autre?
asrd
Messages postés43Date d'inscriptionjeudi 21 septembre 2006StatutMembreDernière intervention10 mai 2007 30 avril 2007 à 11:35
Merci, j'ai trouvé le problème, c'était avec le proxy que ca bloquait.
Maintenant mon serveur web fonctionne pour les pages HTML, je voudrais encore ajouter un petit truc, j'aimerais bien que mon serveur supporte les images gif et jpeg, sais-tu comment faire?