2017-01-07 19 views
0

我試圖從用戶那裏獲取一個HTML輸入,並在瀏覽器中顯示它,無論瀏覽器發出什麼類型的請求。我使用此代碼:C#中的主機HTML#

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)一個無限循環中,瀏覽器不讀任何東西。但是,如果我將它放在while(true)循環中,當localhost:port打開時,瀏覽器將繼續接收HTML數據。

我該如何顯示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(); 
}