2017-01-07 3 views
0

Я пытаюсь взять HTML-ввод от пользователя и отображать его в веб-браузере, независимо от того, какой тип запроса делает браузер. Я использую этот код:Host HTML в C#

try 
{ 
    listener = new TcpListener(Convert.ToInt32(textBox1.Text)); 
    listener.Start(); 
} 
catch (Exception ef) 
{ 
    MessageBox.Show("Error Listening to that port!"); 
} 

TcpClient tcp = listener.AcceptTcpClient(); 
StreamReader sr = new StreamReader(tcp.GetStream()); 
StreamWriter sw = new StreamWriter(tcp.GetStream()); 

try 
{ 
    sw.WriteLine("HTTP/1.0 200 OK\n"); 
    sw.WriteLine(richTextBox1.Text); 
} 
catch (Exception e) 
{ 
    sw.WriteLine("HTTP/1.0 404 OK\n"); 
    MessageBox.Show("Unexpected Error!"); 
} 

Но если я не место sw.WriteLine (richTextBox1.Text) внутри бесконечного цикла, браузер ничего не читает. Но если я помещаю его во время (истинного) цикла, браузер продолжает получать данные HTML при открытии localhost: port.

Что я могу сделать, чтобы отображать данные HTML только один раз?

ответ

0

Во-первых, вы должны использовать тот же поток для чтения и записи. Во-вторых, вы должны уважать HTTP format.

  • Каждая строка заголовка должна заканчиваться символом CR LF ("\ r \ n").
  • Блок заголовка должен заканчиваться пустой строкой
  • Тип или длина содержимого не обязательны, но рекомендуется.

Так полный код:

string message = "<html><body><p>Text : éà</p></body></html>"; 

var listener = new TcpListener(1234); 
listener.Start(); 

// inline helper function 
Action<Stream, string> writeLine = (Stream stream, string msg) => 
{ 
    var bytes = Encoding.UTF8.GetBytes(msg); 
    stream.Write(bytes, 0, bytes.Length); 
}; 

TcpClient tcp = listener.AcceptTcpClient(); 
using (var stream = tcp.GetStream()) 
{ 
    var sr = new StreamReader(stream); 
    var firstRequestLine = sr.ReadLine(); 

    var content = Encoding.UTF8.GetBytes(message); 

    // Write headers 
    writeLine(stream, "HTTP/1.0 200 OK \r\n"); 
    writeLine(stream, "Content-Type: text/html; charset=UTF-8\r\n"); 
    writeLine(stream, "Content-Length: " + content.Length + "\r\n"); 
    writeLine(stream, "\r\n"); // Blank line 
    stream.Flush(); 

    // Write content 
    stream.Write(content, 0, content.Length); 
    stream.Flush(); 
}