Простой сервер C # Http / TCP

#c# #http #sockets #tcp

#c# #http #сокеты #tcp

Вопрос:

Я пытаюсь реализовать простой http-сервер csharp, который отправляет документ, такой как index.html к a браузер, когда пользователь подключается, подключаясь через IP сервера. В настоящее время я немного запутался в том, как я мог бы отправить простой HTML-документ через веб-браузер, чтобы подключающийся пользователь мог его увидеть.

По исходящему потоку вся информация отправляется в браузер.

 using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace TCP_Socket
{
    class ConnectionThread
    {
        public ConnectionThread(Socket socketToHandleConnection)
        {
            connection = socketToHandleConnection;
        }

        Socket        connection       = null;   //TCP/IP socket to handle the actual connection
        NetworkStream connectionStream = null;
        BinaryReader  inStream         = null;
        BinaryWriter  outStream        = null;
        String        userName         = null;

        public void run()
        {
            connectionStream = new NetworkStream(connection);

            inStream  = new BinaryReader(connectionStream);
            outStream = new BinaryWriter(connectionStream);

            userName = Environment.UserName;

            byte b = 0;
            String s = "";      //This will contain all the stuff the browser transmitted,
                                //but "all in one go".
            try
            {
                while (connectionStream.DataAvailable)
                {
                    b = (byte)inStream.ReadSByte();
                    Console.Out.Write((char)b);
                    s  = (char)b;
                }

                String[] items = s.Split();//This will contain all the stuff the browser transmitted,


            }
            catch (EndOfStreamException eos)
            {
                Console.Out.WriteLine("Unexpected end of stream.");
                Console.Out.WriteLine("Error caused by "   eos.Message);
            }
            Console.Out.WriteLine("End of stream.");

            String stringOut = "HTTP/ 1.1 200 OKrn";
            outStream.Write(stringOut.ToCharArray());

            stringOut = "Content-Type: text/htmlrn";
            outStream.Write(stringOut.ToCharArray());

            stringOut = "Date: ";
            outStream.Write(stringOut.ToCharArray());
            stringOut = Convert.ToString(DateTime.Now);
            outStream.Write(stringOut.ToCharArray());   
            stringOut = "rn";
            outStream.Write(stringOut.ToCharArray());

            stringOut = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">rn";
            outStream.Write(stringOut.ToCharArray());

            stringOut = "<html>rn";
            outStream.Write(stringOut.ToCharArray());

            stringOut = "<body>rn";
            outStream.Write(stringOut.ToCharArray());

            stringOut = "Welcome to <strong>"   userName   "'s </strong>primative HTTP server";
            outStream.Write(stringOut.ToCharArray());

            stringOut = "</body></html>rn";
            outStream.Write(stringOut.ToCharArray());

            inStream.Close();
            outStream.Flush();
            outStream.Close();
            connectionStream.Close();
            connection.Close();

            Console.Out.WriteLine("Done; Connection closed.");
        }
    }
}
  

Ответ №1:

Вам не нужно писать весь HTTP-код с использованием сокетов, поскольку HttpListener уже предоставляется с .NET 2.0. попробуйте, если он соответствует вашим требованиям.

Комментарии:

1. Недостатком HttpListener является то, что вам нужно что-то запустить в ОС, прежде чем она позволит вам принимать соединения, т.е. netsh http add urlacl url=http:// :80/MyUri user= DOMAIN user

2. есть альтернативное решение? у меня возникли некоторые проблемы с httplistener

3. HttpListner также не запускается в Windows server 2019. К нему не может быть доступа через локальную сеть, только localhost.

Ответ №2: