2010-11-11 128 views
14

我有一个用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)); 

我认为我必须做某种文件流而不是字符串,但我真的没有胶水..

+0

你能张贴您的handleRequest方法的一部分?我猜这就是你在构建HTTP响应对象的地方,这个响应对象将被发送回发出请求的浏览器。你必须弄清楚如何修改它以支持图像。 – 2010-11-11 13:43:03

+1

如果你想借用它,我有一些胶水:/ – jlafay 2010-11-11 13:53:12

+0

@Martin如果你正在读取文件,你可以调用socket.SendFile。看到这里(msdn.microsoft.com/en-us/library/sx0a40c2.aspx – 2010-11-11 13:58:27

回答

1

你想从发文件或位图对象?

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; 
} 
+0

Ehh。真的有一个发送超载采取流? – jgauffin 2010-11-11 13:35:42

+0

@jgauffin - socket.SendFile()将是选项,如果你只是感兴趣发送文件,但这不会提供正确响应所需的任何正确的HTTP响应格式 – 2010-11-11 13:38:14

+0

这不是我所问:) AFAIK没有重载将流作为参数。 – jgauffin 2010-11-11 13:45:21

1

你为什么要自己创建一个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"); 
+0

,因为它是一个非常简单的,它不像一个HTTP服务器..我只接收命令示例:http://localhost/winamp.play – Martin 2010-11-11 13:49:00

+2

为什么当服务器已经存在时,你写了一个httpserver? – 2010-11-11 13:51:49

+0

真的吗?向我展示一个可以嵌入到.Net 2.0应用程序中的http服务器。 .Net HttpListener需要管理权限才能在某些uris上进行订阅。不太灵活。我的观点是,如果你没有足够的HTTP知识,你可能会浪费很多时间试图让东西工作。使用现有的库应该更有效率。 – jgauffin 2010-11-11 13:54:38