#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:
после поиска я нашел несколько других решений:
Другие подобные встраиваемые серверы включают: