c#Web服务器 - 如何发送图像

时间:2015-07-20 03:58:25

标签: c# html image server hosting

我正在使用C#创建一个服务器,我能够接收请求并返回HTML,但我不确定我必须做什么来发送图像文件,以便它们显示在页面上。

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">

我不确定如何托管该图片并将其显示在那里。

2 个答案:

答案 0 :(得分:0)

我假设您使用的是网络套接字。

您需要将图像作为基本64位编码字符串返回,然后使用

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

格式

答案 1 :(得分:0)

HTTP请求和响应标头有两个换行符(\ n)来划分标题部分和内容部分。

例如:
请求从服务器请求图像(image.gif))

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

<Data_Of_Image>

(图片请求的响应

byte[]



如您所见,响应标题内容之间有两个换行符(\ n)。
因此,您必须将文件读取为字节数组(System.IO.File.ReadAllBytes(string))。在这种情况下,您可以使用string轻松读取文件。

现在,还有一个人离开了。我告诉你把文件读成字节数组,但是没有办法加入byte[]StreamWriter。所以你必须将字符串编码为byte []并连接头字节和内容字节。 +我们无法通过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);

以下是解释:

mariadb

就是这样。我希望你能理解我的坏英语:O。 希望对你有所帮助!