2010-11-11 18 views
14

पर छवि भेजें मेरे पास सी # में लिखा गया एक छोटा HTTP सर्वर है और अब तक मुझे केवल प्रेषक को कच्चे पाठ भेजने की आवश्यकता है। लेकिन अब मुझे एक जेपीजी-छवि भेजनी है और मैं कैसे नहीं समझता।सी # 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)); 

मुझे लगता है कि मैं एक स्ट्रिंग के बजाय filestream किसी तरह का क्या करना है, लेकिन मैं वास्तव में कोई गोंद है ..

+0

आप अपने handleRequest विधि के एक हिस्से को पोस्ट कर सकते हैं? मैं अनुमान लगा रहा हूं कि आप HTTP प्रतिक्रिया ऑब्जेक्ट का निर्माण कर रहे हैं जिसे अनुरोध करने वाले ब्राउज़र पर वापस भेजा जाएगा। छवियों का समर्थन करने के लिए आपको यह समझना होगा कि इसे कैसे संशोधित किया जाए। –

+1

यदि आप इसे उधार लेना चाहते हैं तो मुझे कुछ गोंद है:/ – jlafay

+0

@ मार्टिन अगर आप फ़ाइल से पढ़ रहे हैं तो आप बस सॉकेट को भेज सकते हैं। सैंडफाइल। यहां देखें (msdn.microsoft.com/en-us/library/sx0a40c2.aspx –

उत्तर

1

आप से भेजना चाहते हैं फ़ाइल या बिटमैप ऑब्जेक्ट?

MemoryStream myMemoryStream = new MemoryStream(); 
myImage.Save(myMemoryStream); 
myMemoryStream.Position = 0; 

संपादित

// Send the response 
SendVarData(socket,memoryStream.ToArray()); 

आप इस विधि का दिया 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

एह। क्या वाकई एक ओवरलोड लोड स्ट्रीम ले रहा है? – jgauffin

+0

@jgauffin - socket.SendFile() विकल्प होगा यदि आप केवल रुचि रखते थे फ़ाइल भेजना। हालांकि, उचित प्रतिक्रिया के लिए आवश्यक उचित HTTP प्रतिक्रिया स्वरूपण प्रदान नहीं किया जाएगा। –

+0

जो मैंने नहीं पूछा :) AFAIK कोई बहस एक बहस के रूप में स्ट्रीम नहीं ले रहा है। – jgauffin

1

क्यों तुम अपने आप को एक से httpserver बनाया था का उपयोग कर सकते सॉकेट द्वारा MemoryStream भेजने के लिए? ओपन सोर्स का उपयोग क्यों न करें? उदाहरण मेरा के लिए: 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

+2

सर्वर पहले से मौजूद होने पर आप httpserver क्यों लिखते थे? –

+0

वास्तव में? मुझे एक http सर्वर दिखाएं जिसे .NET 2.0 एप्लिकेशन में एम्बेड किया जा सकता है। .NET HttpListener को कुछ विशेषाधिकारों पर सब्सक्राइब करने में सक्षम होने के लिए प्रशासन विशेषाधिकारों की आवश्यकता होती है। बहुत लचीला नहीं है। मेरा मुद्दा यह था कि यदि आपके पास पर्याप्त HTTP ज्ञान नहीं है तो आप शायद सामान काम करने की कोशिश कर रहे एक लंबे समय तक बर्बाद कर देंगे। मौजूदा पुस्तकालयों का उपयोग करने के लिए यह अधिक प्रभावशाली होना चाहिए। – jgauffin