我这里有一个用C#编写的小型HTTP服务器,直到现在我只需要将原始文本发送回发件人。但现在我必须发送一个JPG-Image,我不知道如何。
这就是我现在所拥有的:
// 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));
我想我必须做一些文件流而不是字符串,但我真的没有胶水..
答案 0 :(得分:2)
您要从文件或位图对象发送吗?
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;
}
答案 1 :(得分:2)
你为什么要自己创建一个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");