C#通过HTTP发送图像
我有一个用C#编写的小型HTTP服务器,直到现在我只需要将原始文本发送回发件人。但现在我必须发送一张JPG图片,我不会介意如何。C#通过HTTP发送图像
这是我现在有:
// Read the HTTP Request
Byte[] bReceive = new Byte[MAXBUFFERSIZE];
int i = socket.Receive(bReceive, bReceive.Length, 0);
//Convert Byte to String
string sBuffer = Encoding.ASCII.GetString(bReceive);
// Look for HTTP request
iStartPos = sBuffer.IndexOf("HTTP", 1);
// Extract the Command without GET_/ at the beginning and _HTTP at the end
sRequest = sBuffer.Substring(5, iStartPos - 1 - 5);
String answer = handleRequest(sRequest);
// Send the response
socket.Send(Encoding.UTF8.GetBytes(answer));
我认为我必须做某种文件流而不是字符串,但我真的没有胶水..
你想从发文件或位图对象?
MemoryStream myMemoryStream = new MemoryStream();
myImage.Save(myMemoryStream);
myMemoryStream.Position = 0;
编辑
// Send the response
SendVarData(socket,memoryStream.ToArray());
通过套接字发送的MemoryStream您可以使用给定的here
private static int SendVarData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
byte[] datasize = new byte[4];
datasize = BitConverter.GetBytes(size);
sent = s.Send(datasize);
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}
你为什么要自己创建一个HttpServer的这种方法吗?为什么不使用开源软件?比如我的:http://webserver.codeplex.com
public class Example
{
private HttpListener _listener;
public void StartTutorial()
{
_listener = HttpListener.Create(IPAddress.Any, 8081);
_listener.RequestReceived += OnRequest;
_listener.Start(5);
}
private void OnRequest(object source, RequestEventArgs args)
{
IHttpClientContext context = (IHttpClientContext)source;
IHttpRequest request = args.Request;
IHttpResponse response = request.CreateResponse(context);
response.Body = new FileStream("Path\\to\\file.jpg");
response.ContentType = "image\jpeg";
response.Send();
}
}
编辑
如果你真的想要做自己做这件事:
string responseHeaders = "HTTP/1.1 200 The file is coming right up!\r\n" +
"Server: MyOwnServer\r\n" +
"Content-Length: " + new FileInfo("C:\\image.jpg").Length + "\r\n" +
"Content-Type: image/jpeg\r\n" +
"Content-Disposition: inline;filename=\"image.jpg;\"\r\n" +
"\r\n";
//headers should ALWAYS be ascii. Never UTF8
var headers = Encoding.ASCII.GetBytes(responseHeaders);
socket.Send(headers, 0, headers.Length);
socket.SendFile("C:\\image.jpg");
,因为它是一个非常简单的,它不像一个HTTP服务器..我只接收命令示例:http://localhost/winamp.play – Martin 2010-11-11 13:49:00
为什么当服务器已经存在时,你写了一个httpserver? – 2010-11-11 13:51:49
真的吗?向我展示一个可以嵌入到.Net 2.0应用程序中的http服务器。 .Net HttpListener需要管理权限才能在某些uris上进行订阅。不太灵活。我的观点是,如果你没有足够的HTTP知识,你可能会浪费很多时间试图让东西工作。使用现有的库应该更有效率。 – jgauffin 2010-11-11 13:54:38
你能张贴您的handleRequest方法的一部分?我猜这就是你在构建HTTP响应对象的地方,这个响应对象将被发送回发出请求的浏览器。你必须弄清楚如何修改它以支持图像。 – 2010-11-11 13:43:03
如果你想借用它,我有一些胶水:/ – jlafay 2010-11-11 13:53:12
@Martin如果你正在读取文件,你可以调用socket.SendFile。看到这里(msdn.microsoft.com/en-us/library/sx0a40c2.aspx – 2010-11-11 13:58:27