c# Web 服务器 - 如何发送图像
c# Web Server - How to send images
我正在使用 C# 创建一个服务器,我能够接收请求和 return 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">
我不确定如何托管该图像并将其显示在那里。
我假设您使用的是网络套接字。
您需要 return 图像作为 base 64 编码字符串,然后使用
<img src ="data:image/png;base64," + base64ImageHere
格式
HTTP请求和响应header有两个换行符(\n)来分隔Header部分和内容部分。
例如:
(请求 从服务器请求图像(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>
如您所见,response header 和 contents.
之间有两个换行符 (\n)
因此,您必须将文件读取为字节数组 (byte[]
)。在这种情况下,您可以使用 System.IO.File.ReadAllBytes(string)
.
轻松读取文件
现在,还剩一个。我告诉过你读取文件作为 字节数组 ,但是没有办法加入 string
和 byte[]
。所以你必须将字符串编码为 byte[] 并加入 header 字节和内容字节。
+ 我们不能通过 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。
希望对您有所帮助!
我正在使用 C# 创建一个服务器,我能够接收请求和 return 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">
我不确定如何托管该图像并将其显示在那里。
我假设您使用的是网络套接字。
您需要 return 图像作为 base 64 编码字符串,然后使用
<img src ="data:image/png;base64," + base64ImageHere
格式
HTTP请求和响应header有两个换行符(\n)来分隔Header部分和内容部分。
例如:
(请求 从服务器请求图像(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>
如您所见,response header 和 contents.
之间有两个换行符 (\n)
因此,您必须将文件读取为字节数组 (byte[]
)。在这种情况下,您可以使用 System.IO.File.ReadAllBytes(string)
.
现在,还剩一个。我告诉过你读取文件作为 字节数组 ,但是没有办法加入 string
和 byte[]
。所以你必须将字符串编码为 byte[] 并加入 header 字节和内容字节。
+ 我们不能通过 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。 希望对您有所帮助!