PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c# - html-file an client senden und anzeigen



Roboman93
27.01.2009, 18:24
ich habe mir in c# einen mini-server geproggt, der auf eine verbindung wartet und dann eine html-file sendet, die dann im browser vom client gezeigt werden soll. ich sende die datei mit newSocket.sendFile(der filename.html)

im browser wird dann eine datenübertragung angezeict, die aber nicht endet. muss ich nach dem senden der datei noch etwas senden, um die datenübertragung zu beenden?


mfg roboman

Ceos
27.01.2009, 22:45
das HTTProtokoll ist doch ne spur komplizierter, die erfahrung musst ich auch erst selber machen, einfach nur dateien zu senden KANN funktionieren aber meist nur bei textfiles oder reinen textdatenströmen *in der gedächtniskiste wühlt* es müsste aber in C# einige spezialisiertere klassen geben die das für dich übernehmen .... ich kanns aber auch lieder grad nich in der MSDN finden sorry wenn ich da so direkt nicht weiterhelfen kann

Roboman93
28.01.2009, 18:58
ok, ich kann jetzt html-seiten übertragen und sie werden angezeigt. man muss forher noch ne file mit verschiedenen infos an den browser senden.

mfg roboman

TheDarkRose
29.01.2009, 20:06
Wie hast du dir deinen mini-server gebaut? Lad doch mal das Projekt als zip hoch

für HTTP-Server gibt es eine extra HttpListener Klasse die als Server fungiert.

Ceos
30.01.2009, 08:25
danke @ darkrose ^^ ich hab mich dusslig gesucht nach der klasse, aber hab irgendwie nach dem falschen begriffen gesucht

Roboman93
30.01.2009, 17:50
ne, den server hab ich nicht gebaut, läuft auf meinem läppi, war aber nur ein experiment. aber danke für den hinweiß für die klasse. mein "server" hat zwar funktioniert, aber immer nur eine verbindung gleichzeitig.

mfg roboman

TheDarkRose
30.01.2009, 17:56
Ach HttpListener und die ganzen anderen Klassen und Structs die dazu gehören sind echt was feines. Besonders, die asynchronen Methoden.

Lad doch trotzdem mal den Code hoch. Mit gebaut meinte ich ja eig. programmiert.

Roboman93
31.01.2009, 12:04
ach so. funktioniert ganz gut, nur das das prog solange blockt, bis es ne verbindung angenommen hat. ich habs so gelöst, dass sich das prog selbst beendet, wenn man in seiner browser localhost/close eingibt. ich lad mal den debugordner hoch. da is auch schon ne simple html-site drin.

sorry, kann nichts mehr hochladen. gobts da ne andere möglichkeit?

mfg roboman

TheDarkRose
31.01.2009, 12:43
ach so. funktioniert ganz gut, nur das das prog solange blockt, bis es ne verbindung angenommen hat. ich habs so gelöst, dass sich das prog selbst beendet, wenn man in seiner browser localhost/close eingibt.
War das dein SErver oder ist das mit der HttpListener Klasse?

Roboman93
31.01.2009, 17:02
mit der listenerklasse. habs so wie auf der msnd-seite gemacht.

mfg roboman

TheDarkRose
01.02.2009, 11:16
Hmm. Lad mal das Projekt hoch bitte

Als ich es damals mal verwendet hatte, hab ich für den Listener einen extra Thread instanziert.

achja mit der Methode Abort() kannst du ihn jederzeit beenden unabhängig vom zustand.

Edit: Du wirst wahrscheinlich die synchrone Methode GetContext() verwendet haben? Somit ist klar das die Anwendung blockt. WEnn du die asynchronen Methoden BeginGetContext() und EndGetContext() nimmst, dann wird für jede HTTP Verbindung ein eigener Ausführungsthread gestartet.

Ich hab es damals so gemacht, das ich den HttpListener schon in einen extrigen Thread gestartet habe und zusätzlic für die Verbindungen die asynchronen Methoden verwendet hab. müsste aber auch gehen wenn du den listener im selben thread wie die main anwendung startest( ist ja bei reinen servern so, bei mir war ja damals der listener nur zusatz bonus einer bestehen anwendung) und die asynchronen methoden verwendest.


public static void NonblockingListener(string [] prefixes)
{
HttpListener listener = new HttpListener();
foreach (string s in prefixes)
{
listener.Prefixes.Add(s);
}
listener.Start();
IAsyncResult result = listener.BeginGetContext(new AsyncCallback(ListenerCallback),listener);
// Applications can do some work here while waiting for the
// request. If no work can be done until you have processed a request,
// use a wait handle to prevent this thread from terminating
// while the asynchronous operation completes.
Console.WriteLine("Waiting for request to be processed asyncronously.");
result.AsyncWaitHandle.WaitOne();
Console.WriteLine("Request processed asyncronously.");
listener.Close();
}

public static void ListenerCallback(IAsyncResult result)
{
HttpListener listener = (HttpListener) result.AsyncState;
// Call EndGetContext to complete the asynchronous operation.
HttpListenerContext context = listener.EndGetContext(result);
HttpListenerRequest request = context.Request;
// Obtain a response object.
HttpListenerResponse response = context.Response;
// Construct a response.
string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString) ;
// Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer,0,buffer.Length);
// You must close the output stream.
output.Close();
}

Roboman93
02.02.2009, 15:32
ok, danke, ich habs mit getContext gemacht. werds gleich mal mit deinem code probieren.

mfg roboman

TheDarkRose
02.02.2009, 17:56
Der Code ist aus der MSDN raus. Steht bei der Methode BeginGetContext() als Beispiel dabei.