如何使用 TcpClient 将图像作为 HTTP 响应发送
How to send image as an HTTP response using TcpClient
在我的工作中,我将服务器和客户端(多个设备)连接到同一个网络。
客户使用他们的网络浏览器与服务器联系。
服务器是 运行 一个 C# 程序,它使用 TcpListener
接收来自浏览器的请求。
我正在尝试通过 TcpClient
将图像发送到客户端设备,但这是结果:
我试过了:
- 读取图片文件为
String
- 读取图像文件为
Byte[]
在 Chrome 开发者控制台中进行一些搜索后,我发现了一个错误
net::ERR_CONTENT_LENGTH_MISMATCH
.
我不知道为什么 Content-Length: length-in-byte
值即使通过 new FileInfo(Target).Length
也不正确。
我使用的代码:
TcpListener Listener = new TcpListener(local_address, 9090);
Listener.Start();
TcpClient client = Listener.AcceptTcpClient();
NetworkStream ns = client.GetStream();
string target = HeaderKeys.GetValue("target"); /* image file in the request*/
string mime_type = MimeType.Extract(target); /* mime-type of the file */
byte[] content = File.ReadAllBytes(target);
StreamWriter writer = new StreamWriter(ns);
// response header
writer.Write("HTTP/1.0 200 OK");
writer.Write(Environment.NewLine);
writer.Write($"Content-Type: {mime_type}");
writer.Write(Environment.NewLine);
writer.Write("Content-Length: " + content.Length);
writer.Write(Environment.NewLine);
writer.Write(Environment.NewLine);
writer.Write(content);
writer.Flush();
client.Close();
我试过了
NetworkStream
直接
- 正在读取图像文件
MemoryStream
并且 NetworkStream
正在写入。
- 读取图像文件为 byte[] 并将其转换为 Base64。
问题是因为 StreamWriter
我已经使用以下代码解决了这个问题:
TcpClient client = Listener.AcceptTcpClient();
Stream s = client.GetStream();
byte[] file_content = File.ReadAllBytes(file);
StringBuilder header = new StringBuilder();
header.Append("HTTP/1.1 200 OK\r\n");
header.Append($"Content-Type: {mime_type}\r\n");
header.Append($"Content-Length: {file_content .Length}\r\n\n");
byte[] h = Encoding.ASCII.GetBytes(header.ToString());
s.Write(content, 0, content.Length);
s.Write(b, 0, b.Length);
s.Flush();
client.Close();
在我的工作中,我将服务器和客户端(多个设备)连接到同一个网络。
客户使用他们的网络浏览器与服务器联系。
服务器是 运行 一个 C# 程序,它使用 TcpListener
接收来自浏览器的请求。
我正在尝试通过 TcpClient
将图像发送到客户端设备,但这是结果:
我试过了:
- 读取图片文件为
String
- 读取图像文件为
Byte[]
在 Chrome 开发者控制台中进行一些搜索后,我发现了一个错误
net::ERR_CONTENT_LENGTH_MISMATCH
.
我不知道为什么 Content-Length: length-in-byte
值即使通过 new FileInfo(Target).Length
也不正确。
我使用的代码:
TcpListener Listener = new TcpListener(local_address, 9090);
Listener.Start();
TcpClient client = Listener.AcceptTcpClient();
NetworkStream ns = client.GetStream();
string target = HeaderKeys.GetValue("target"); /* image file in the request*/
string mime_type = MimeType.Extract(target); /* mime-type of the file */
byte[] content = File.ReadAllBytes(target);
StreamWriter writer = new StreamWriter(ns);
// response header
writer.Write("HTTP/1.0 200 OK");
writer.Write(Environment.NewLine);
writer.Write($"Content-Type: {mime_type}");
writer.Write(Environment.NewLine);
writer.Write("Content-Length: " + content.Length);
writer.Write(Environment.NewLine);
writer.Write(Environment.NewLine);
writer.Write(content);
writer.Flush();
client.Close();
我试过了
NetworkStream
直接- 正在读取图像文件
MemoryStream
并且NetworkStream
正在写入。 - 读取图像文件为 byte[] 并将其转换为 Base64。
问题是因为 StreamWriter
我已经使用以下代码解决了这个问题:
TcpClient client = Listener.AcceptTcpClient();
Stream s = client.GetStream();
byte[] file_content = File.ReadAllBytes(file);
StringBuilder header = new StringBuilder();
header.Append("HTTP/1.1 200 OK\r\n");
header.Append($"Content-Type: {mime_type}\r\n");
header.Append($"Content-Length: {file_content .Length}\r\n\n");
byte[] h = Encoding.ASCII.GetBytes(header.ToString());
s.Write(content, 0, content.Length);
s.Write(b, 0, b.Length);
s.Flush();
client.Close();