Simple HTTP Server

0

Mam kilka pytań związanych z poniższym kodem. Zamieszczone są w komentarzach. Będę wdzięczny za wyjaśnienie tego.

      private Socket httpServer;
      private int serverPort = 80;
      private Thread thread;


                  serverPort = int.Parse(PortTxtBox.Text.ToString());

                  if(serverPort > 65535 || serverPort <= 0)
                  {
                      throw new Exception("Server port not within the range");
                  }

              thread = new Thread(new ThreadStart(this.connectionThreadMethod));  //po co tutaj wątek?
              thread.Start();

              StartServerBtn.Enabled = false;
              StopServerBtn.Enabled = true;


     private void connectionThreadMethod()
      {
          IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, serverPort);  //do czego służy endpoint?
          httpServer.Bind(endPoint);   //w jakim celu się binduje?
          httpServer.Listen(1);  //w jakim celu się nasłuchuje?

          startListeningForConnection();
      }


     private void startListeningForConnection()
      {
          while(true)
          {
              DateTime time = DateTime.Now;
              string data = "";
              byte[] bytes = new byte[2048];  //w jakim celu tworzy się tablicę byteów i co one zawierają?

              Socket client = httpServer.Accept();  //Blocking Statement

              while(true)
              {
                  int numBytes = client.Receive(bytes);
                  data += Encoding.ASCII.GetString(bytes, 0, numBytes);

                  if(data.IndexOf("\r\n") > -1)
                  {
                      break;
                  }
              }

              //data read
              ServerLogsTxtBox.Invoke((MethodInvoker)delegate
              {
                  //Runs inside UI Thread
                  ServerLogsTxtBox.Text += "\r\n\r\n";
                  ServerLogsTxtBox.Text += data;
                  ServerLogsTxtBox.Text += "\n\n ----- End of Request -----";
              });

              //Send back to response
              string responseHeader = "HTTP/1.1 200 Everything is fine\nServer: my_csharp_server\n Content-Type: " +
                  "text/html; charset: UTF-8;";
              string responseBody = "<!DOCTYPE html> <html>" +
                  "<Head><title></title>></head>" +
                  "<body><h4>" +"Server time is: " + time.ToString() + "</h4></body>" +
                  "</html>";
              string responseString = responseHeader + responseBody;
              byte[] responseData = Encoding.ASCII.GetBytes(responseString);  
              client.SendTo(responseData, client.RemoteEndPoint);  //co to jest RemoteEndPoint?

              client.Close();

          }
          ```
1

Tak przynajmniej widać gdzie te komentarze:

 private Socket httpServer;
      private int serverPort = 80;
      private Thread thread;


                  serverPort = int.Parse(PortTxtBox.Text.ToString());

                  if(serverPort > 65535 || serverPort <= 0)
                  {
                      throw new Exception("Server port not within the range");
                  }

              thread = new Thread(new ThreadStart(this.connectionThreadMethod));  //po co tutaj wątek?
              thread.Start();

              StartServerBtn.Enabled = false;
              StopServerBtn.Enabled = true;


     private void connectionThreadMethod()
      {
          IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, serverPort);  //do czego służy endpoint?
          httpServer.Bind(endPoint);   //w jakim celu się binduje?
          httpServer.Listen(1);  //w jakim celu się nasłuchuje?

          startListeningForConnection();
      }


     private void startListeningForConnection()
      {
          while(true)
          {
              DateTime time = DateTime.Now;
              string data = "";
              byte[] bytes = new byte[2048];  //w jakim celu tworzy się tablicę byteów i co one zawierają?

              Socket client = httpServer.Accept();  //Blocking Statement

              while(true)
              {
                  int numBytes = client.Receive(bytes);
                  data += Encoding.ASCII.GetString(bytes, 0, numBytes);

                  if(data.IndexOf("\r\n") > -1)
                  {
                      break;
                  }
              }

              //data read
              ServerLogsTxtBox.Invoke((MethodInvoker)delegate
              {
                  //Runs inside UI Thread
                  ServerLogsTxtBox.Text += "\r\n\r\n";
                  ServerLogsTxtBox.Text += data;
                  ServerLogsTxtBox.Text += "\n\n ----- End of Request -----";
              });

              //Send back to response
              string responseHeader = "HTTP/1.1 200 Everything is fine\nServer: my_csharp_server\n Content-Type: " +
                  "text/html; charset: UTF-8;";
              string responseBody = "<!DOCTYPE html> <html>" +
                  "<Head><title></title>></head>" +
                  "<body><h4>" +"Server time is: " + time.ToString() + "</h4></body>" +
                  "</html>";
              string responseString = responseHeader + responseBody;
              byte[] responseData = Encoding.ASCII.GetBytes(responseString);  
              client.SendTo(responseData, client.RemoteEndPoint);  //co to jest RemoteEndPoint?

              client.Close();

          }
2

Endpoint definiuje na jakim porcie i na jakim adresie IP będziesz nasłuchiwać. Nasłuchiwanie polega na tym, że czekasz na kolejne połączenie od klienta i zaczynasz je obsługiwać, kiedy się pojawi. Ta tablica bajtów tam dalej to bufor - dane od klienta (żądanie HTTP) są do niej wczytywane aby wczytać wiele danych za jednym zamachem, a nie np. czytać bajt po bajcie. Potem jak widzisz jest to konwertowane do łańcucha znaków aby wydobyć żądanie.

1
S4t napisał(a):

Tak przynajmniej widać gdzie te komentarze:

 private Socket httpServer;
      private int serverPort = 80;
      private Thread thread;


                  serverPort = int.Parse(PortTxtBox.Text.ToString());

                  if(serverPort > 65535 || serverPort <= 0)
                  {
                      throw new Exception("Server port not within the range");
                  }

              thread = new Thread(new ThreadStart(this.connectionThreadMethod));  //po co tutaj wątek?
//Żeby nie blokować wykonania obecnego wątku, jeżeli zamiast wątku wywołasz connectionThreadMethod to potem są pętlę while(true)
              thread.Start();

              StartServerBtn.Enabled = false;
              StopServerBtn.Enabled = true;


     private void connectionThreadMethod()
      {
          IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, serverPort);  //do czego służy endpoint? https://docs.microsoft.com/pl-pl/dotnet/api/system.net.ipendpoint?view=net-6.0

          httpServer.Bind(endPoint);   //w jakim celu się binduje?
//rezerwujesz port w systemie, czyli mówisz że serwer będzie stał na porcie np. 1234
          httpServer.Listen(1);  //w jakim celu się nasłuchuje?
//żeby odbierać pakiety

          startListeningForConnection();
      }


     private void startListeningForConnection()
      {
          while(true)
          {
              DateTime time = DateTime.Now;
              string data = "";
              byte[] bytes = new byte[2048];  //w jakim celu tworzy się tablicę byteów i co one zawierają?
//Na początku jest wartość domyślną czyli 0, a tworzy ją się po to żeby serwer miał gdzie zapisać dane które przychodzą po sieci 

              Socket client = httpServer.Accept();  //Blocking Statement

              while(true)
              {
                  int numBytes = client.Receive(bytes);
                  data += Encoding.ASCII.GetString(bytes, 0, numBytes);

                  if(data.IndexOf("\r\n") > -1)
                  {
                      break;
                  }
              }

              //data read
              ServerLogsTxtBox.Invoke((MethodInvoker)delegate
              {
                  //Runs inside UI Thread
                  ServerLogsTxtBox.Text += "\r\n\r\n";
                  ServerLogsTxtBox.Text += data;
                  ServerLogsTxtBox.Text += "\n\n ----- End of Request -----";
              });

              //Send back to response
              string responseHeader = "HTTP/1.1 200 Everything is fine\nServer: my_csharp_server\n Content-Type: " +
                  "text/html; charset: UTF-8;";
              string responseBody = "<!DOCTYPE html> <html>" +
                  "<Head><title></title>></head>" +
                  "<body><h4>" +"Server time is: " + time.ToString() + "</h4></body>" +
                  "</html>";
              string responseString = responseHeader + responseBody;
              byte[] responseData = Encoding.ASCII.GetBytes(responseString);  
              client.SendTo(responseData, client.RemoteEndPoint);  //co to jest RemoteEndPoint?

              client.Close();

          }

1 użytkowników online, w tym zalogowanych: 0, gości: 1