using System.Net.Sockets;
using System.Threading.Tasks;
private readonly IPAddress ipAddress;
private readonly int port;
private readonly TcpListener tcpListener;
public HttpServer(string ipAddress, int port)
this.ipAddress = IPAddress.Parse(ipAddress);
this.tcpListener = new TcpListener(this.ipAddress, port);
public async Task Start()
this.tcpListener.Start();
Console.WriteLine($"Server started on port {this.port}");
var tcpClient = await this.tcpListener.AcceptTcpClientAsync();
_ = ProcessClientAsync(tcpClient);
private async Task ProcessClientAsync(TcpClient tcpClient)
var networkStream = tcpClient.GetStream();
var request = await this.ReadRequest(networkStream);
Console.WriteLine(request);
await WriteResponse(networkStream);
private async Task<string> ReadRequest(NetworkStream networkStream)
var buffer = new byte[bufferSize];
var requestText = new StringBuilder();
if (!networkStream.DataAvailable)
var bytesRead = networkStream.Read(buffer, 0, bufferSize);
requestText.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead));
return requestText.ToString();
private async Task WriteResponse(NetworkStream networkStream)
var content = "Hello World!";
var contentLength = Encoding.UTF8.GetByteCount(content);
var response = $"HTTP/1.1 200 OK\r\n";
response += "Server: My Web Server\r\n";
response += $"Date: {DateTime.UtcNow.ToString("r")}\r\n";
response += $"Content-Length: {contentLength}\r\n";
response += "Content-Type: text/plain; charset=UTF-8\r\n\r\n";
var responseBytes = Encoding.UTF8.GetBytes(response);
await networkStream.WriteAsync(responseBytes);