In this short tutorial I’ll explain how to make a simple Http Server using only C#. The server will be able to serve any page that contains client-side code (html and javascript).
Basic stuff
When a client requests a page of a website (let’s say index.html), the Http Server will start looking for that file. If the file is found, the server will read all the content and send it back to the client as a byte array. After this, the connection is closed.
The coding part
Before starting, you need to change your project’s profile to .NET Framework 4 (not .NET Framework 4 client profile). This can be done by going to Project->Project properties->Application.
Now, go to Solution Explorer->References->Add Reference->.NET and import System.Web .
Also make sure you have the following lines included in your project’s header:
using System;
using System.Net;
using System.IO;
using System.Text;
Creating the server is quite simple - we’ll use .NET’s HttpListener:
HttpListener server = new HttpListener(); // this is the http server
server.Prefixes.Add("http://127.0.0.1/"); //we set a listening address here (localhost)
server.Prefixes.Add("http://localhost/");
server.Start(); // and start the server
The server is made, now we need to identify incoming connections and serve the requested files. For each connection, we send only one file and because we might have multiple connections, we’ll need an endless loop to handle them one by one.
while (true)
{
HttpListenerContext context = server.GetContext();
//context: provides access to httplistener's response
HttpListenerResponse response = context.Response;
//the response tells the server where to send the datas
string page = Directory.GetCurrentDirectory() + context.Request.Url.LocalPath;
//this will get the page requested by the browser
if (page == string.Empty) //if there's no page, we'll say it's index.html
page = "index.html";
TextReader tr = new StreamReader(page);
string msg = tr.ReadToEnd(); //getting the page's content
byte[] buffer = Encoding.UTF8.GetBytes(msg);
//then we transform it into a byte array
response.ContentLength64 = buffer.Length; // set up the messasge's length
Stream st = response.OutputStream; // here we create a stream to send the message
st.Write(buffer, 0, buffer.Length); // and this will send all the content to the browser
context.Response.Close(); // here we close the connection
}
Well, this is all, now all you need to do is to create some html pages and place them into your executable’s directory.
Then run the application and access
http://127.0.0.1/anyfile.html.
You should be able to see your file in the browser’s window.
The complete code
using System;
using System.Net;
using System.IO;
using System.Text;
namespace test
{
class Program
{
static void Main(string[] args)
{
HttpListener server = new HttpListener();
server.Prefixes.Add("http://127.0.0.1/");
server.Prefixes.Add("http://localhost/");
server.Start();
Console.WriteLine("Listening...");
while (true)
{
HttpListenerContext context = server.GetContext();
HttpListenerResponse response = context.Response;
string page = Directory.GetCurrentDirectory() + context.Request.Url.LocalPath;
if (page == string.Empty)
page = "index.html";
TextReader tr = new StreamReader(page);
string msg = tr.ReadToEnd();
byte[] buffer = Encoding.UTF8.GetBytes(msg);
response.ContentLength64 = buffer.Length;
Stream st = response.OutputStream;
st.Write(buffer, 0, buffer.Length);
context.Response.Close();
}
}
}
}
Remember that this server isn’t able to parse server-side languages like PHP or ASP.NET, it just sends the file’s content to the browser.
No comments:
Post a Comment