2015-07-20 57 views
1

我創建一個使用C#的服務器,我能夠接收請求並返回HTML,但我不知道我必須做什麼來發送圖像文件,以便它們將顯示在頁面上。c#Web服務器 - 如何發送圖像

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

namespace Ambar 
{ 
    class Program 
    { 


     static void Main(string[] args) 
     { 
      TcpListener listener = new TcpListener(80); 
      listener.Start(); 
      while (true) 
      { 
       Console.WriteLine("waiting for a connection"); 
       TcpClient client = listener.AcceptTcpClient(); 

       StreamReader sr = new StreamReader(client.GetStream()); 
       StreamWriter sw = new StreamWriter(client.GetStream()); 
       Console.WriteLine(client.GetStream().ToString()); 

       try 
       { 
        string request = sr.ReadLine(); 

        Console.WriteLine(request); 
        string[] tokens = request.Split(' '); 
        string page = tokens[1]; 
        if (page == "/") 
        { 
         page = "/default.htm"; 
        } 
        StreamReader file = new StreamReader("../../web" + page); 
        sw.WriteLine("HTTP/1.0 200 OK\n"); 

        string data = file.ReadLine(); 
        while (data != null) 
        { 
         sw.WriteLine(data); 
         sw.Flush(); 
         data = file.ReadLine(); 
        } 
       } 
       catch (Exception e) 
       { 
        sw.WriteLine("HTTP/1.0 404 OK\n"); 
        sw.WriteLine("<H1> Future Site of Ambar Remake </H!>"); 
        sw.Flush(); 
       } 

       client.Close(); 
      } 
     } 
    } 

我能夠承載我想要的任何HTML,但如果我試圖像

<img src="picture.gif" alt="a picture" height="42" width="42">

顯示圖像,我不知道如何來承載圖像並將其顯示那裏。

+0

您是否試圖以二進制格式發送圖像? –

回答

0

HTTP請求和響應首部具有兩個換行符(\ n)的分接頭連接器部分和內容部分。

例如:
請求該請求來自服務器的圖像(Image.gif的))

GET /image.gif HTTP/1.1 
User-Agent: WebBrowser 
Accept-Encoding: deflate,gzip 
Connection: keep-alive 
... and more headers if present ... 

用於圖像請求響應

HTTP/1.1 200 OK 
Content-Length: <Length_Of_Content> 
Content-Type: image/gif 
... and more headers if present ... 

<Data_Of_Image> 



如您所見,響應標題內容之間有兩個換行符(\ n)。
所以,你必須讀取文件作爲字節數組(byte[])。在這種情況下,您可以使用System.IO.File.ReadAllBytes(string)輕鬆讀取文件。

現在,剩下一個。我告訴你讀取文件爲字節數組,但沒有辦法加入stringbyte[]。所以你必須將字符串編碼爲byte []並加入頭字節和內容字節。 +我們不能通過StreamWriter發送字節數組,所以我們將使用NetworkStream

這裏的解釋:

NetworkStream ns = client.GetStream(); 

... 

string[] tokens = request.Split(' '); 
string page = tokens[1]; 
if (page == "/") 
{ 
    page = "/default.htm"; 
} 
//StreamReader file = new StreamReader("../../web" + page); 
byte[] file = null; 

try { file = File.ReadAllBytes(@"../../web" + page); } 

// In this 'catch' block, you can't read requested file. 
catch { 
    // do something (like printing error message) 
} 

// We are not going to use StreamWriter, we'll use StringBuilder 
StringBuilder sbHeader = new StringBuilder(); 

// STATUS CODE 
sbHeader.AppendLine("HTTP/1.1 200 OK"); 

// CONTENT-LENGTH 
sbHeader.AppendLine("Content-Length: " + file.Length); 

// Append one more line breaks to seperate header and content. 
sbHeader.AppendLine(); 

// List for join two byte arrays. 
List<byte> response = new List<byte>(); 

// First, add header. 
response.AddRange(Encoding.ASCII.GetBytes(sbHeader.ToString())); 

// Last, add content. 
response.AddRange(file); 

// Make byte array from List<byte> 
byte[] responseByte = response.ToArray(); 

// Send entire response via NetworkStream 
ns.Write(responseByte, 0, responseByte.Length); 

這是它。我希望你能理解我的壞話:O。 希望這個幫助給你!

+0

它工作!你是最好的! – Bipeo

+0

@Bipeo你的歡迎:D – SlaneR

0

我假設你使用的是網絡套接字。

您需要使圖像返回作爲基64編碼的字符串,然後使用

<img src ="data:image/png;base64," + base64ImageHere 

格式