2012-01-22 3 views
6

नमस्ते मैं फ्लेक्स से सी # सर्वर से एक साधारण HTTP संदेश भेजने की कोशिश कर रहा हूं, लेकिन ऐसा लगता है कि मुझे टॉव कॉल मिल रही हैं, पहला असली है और दूसरा खाली है।फ्लेक्स इन सी # सर्वर

यह क्यों है और मैं इसे कैसे संभाल सकता हूं?

यह मेरी सी # कोड है:

TcpListener listener = new TcpListener(IPAddress.Any, 9400); 
listener.Start(); 
Console.WriteLine("Server started"); 
Socket client; 
while (true) 
{ 
    client = listener.AcceptSocket(); 
    // client.Available is an expensive call so it's just for testing 
    Console.WriteLine("Client accepted " + client.Connected + " " + client.Available); 
    SocketHandler handler = new SocketHandler(); 
    ThreadPool.QueueUserWorkItem(handler.handleSocket, client); 
} 

इस SocketHandler है:

public void handleSocket(object socketObjeck) 
{ 
    try 
    { 
     socket = (Socket)socketObjeck; 
     byte[] buffer = new byte[1024]; 
     SocketSettings.setSocket(socket); 
     //blocker... 
     try 
     { 
      socket.Receive(buffer); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error\nFaild reading from socket\n" + e.Message); 
      socket.Close(); 
      return; 
     } 
     parseData(buffer); 

     socket.Close(3); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Error\nError \n" + e.Message + "\n" + e.StackTrace); 
    } 
} 

और ये मेरे फ्लेक्स कोड है:

var request:URLRequest = new URLRequest(); 
request.data = "Hello from flex"; 
request.url = URL; 
request.method = URLRequestMethod.POST; 
loader.load(request); 

मैं हमेशा 2 कॉल हो रही है। लाइन:

Console.WriteLine("Client accepted " + client.Connected + " " + client.Available); 

दो बार कहा जाता है। मुझे क्या याद आ रही है?

संपादित करें 1: मुझे यकीन है कि दूसरी कॉल खाली है के लिए आपको बता सकता है, यह भी नहीं क्रोम JavaScript कंसोल, यह फ्लेक्स एक कनेक्शन खोलने, और कुछ प्रतिक्रिया की प्रतीक्षा करने या मैं नहीं जानता की तरह है में देखा है क्या ... लेकिन यह कोई डेटा नहीं भेज रहा है।

संपादित करें 2:

मैं एक सच्चे HTTP प्रतिसाद एक नोटिस एक और बात भेजने की कोशिश कर रहा है, दूसरी कॉल पहले कॉल का इंतजार किए बिना ही आ रहा है, अगर मैं छोटी नींद के जवाब धागा डाल रहा हूँ (मेरे परीक्षण में 100 मिलीसेकंड) तो पहले मुझे प्रतिक्रिया देने में सक्षम होने से पहले मुझे दूसरी कॉल मिल रही है।

पी.एस फ्लेक्स 4.6, विजुअल स्टूडियो 2010

+0

वास्तव में अनुरोध किए जा रहे क्लाइंट के अंत में क्यों नज़र डालें? फायरबग, फिडलर या चार्ल्स सभी ऐसा करने में सक्षम होंगे। – spender

उत्तर

0

इसके बाद यह क्रॉसडोमेन अनुरोध था। यदि आप www फ़ोल्डर में क्रॉसडोमेन फ़ाइल नहीं जोड़ रहे हैं, तो फ्लेक्स आपको एक खाली संदेश भेजेगा (यदि आप क्रॉसडोमेन के साथ इस संदेश का जवाब देने का प्रयास करेंगे, तो यह काम करना चाहता है)।

3

@Spender उल्लेख किया है का उपयोग करना, यह मुश्किल को पता है कि कॉल के लिए कारण है, यह जानकर कॉल क्या कर रहे हैं के बिना।

हालांकि, यह देखते हुए कि आप URLRequest संवाद करने के लिए उपयोग कर रहे हैं, यह संभव है कि पहला कॉल crossdomain.xml फ़ाइल का अनुरोध है, जो फ़्लैश प्लेयर के लिए आपके सर्वर के साथ संवाद करने के लिए मौजूद होना चाहिए।

अन्य प्रोटोकॉल अलग initialisation कॉल (जैसे।, RemoteObject या NetConnection स्थानीय FlexClientId सेटअप करने के लिए एक आरंभिक कॉल भेज देंगे, और एक SocketServer एक विशिष्ट पोर्ट पर एक crossdomain.xml के लिए कॉल करेंगे।)

नैतिक कहानी का: आपको यह जांचने की आवश्यकता है कि आप जवाब देने से पहले अनुरोध की सामग्री क्या है।

+0

+1 यह बहुत अधिक है जहां मैंने सोचा था कि आगे की जांच का नेतृत्व हो सकता है (यानी crossdomain.xml के लिए अनुरोध) – spender

1

मैं दो अंक देखें:

  • crossdomain.xml उपस्थित होने को यह क्लाइंट साइड

  • सर्वर साइड बजाय TcpListener पर उपयोग HttpListener से काम करने के लिए server-side है, यह कर देगा अपने कोड बहुत अधिक मजबूत है क्योंकि इसमें सभी http प्रोटोकॉल विवरण लागू किए गए हैं और आपको केवल "असली काम"

पर ध्यान केंद्रित करने की अनुमति देता है

कृपया पूछें कि क्या आपको और विवरण/नमूने इत्यादि की आवश्यकता है

+0

वास्तव में एचटीपी लिस्टनर समस्या हल करता है, लेकिन फिर आप इसे डीबग नहीं कर सकते क्योंकि इसे सर्वर चलाने के लिए व्यवस्थापक अनुमति की आवश्यकता होती है, और कुछ हैं माइक्रोसॉफ्ट कार्यान्वयन से अतिरिक्त पार्सिंग जो एक समय बर्बाद है और मेरे लिए जरूरी नहीं है। और सबसे महत्वपूर्ण बात यह है कि मुझे यह नहीं पता कि यह समस्या ठीक कर रहा है, शायद वे खाली संदेशों पर पकड़ने की कोशिश कर रहे हैं, इसलिए मैं इसे भी नहीं देख सकता ... क्रॉसडोमेन के बारे में, अगर वह एएसआईयू था तो मेरा ग्राहक ' टी बिल्कुल काम करने में सक्षम नहीं है, लेकिन यह है कि, वह केवल अनावश्यक संदेश भेज रहा है ... –

+0

@ बाबिबू 'एचटीपी लिस्टनर' को व्यवस्थापक निजीकरण के बिना शुरू किया जा सकता है (esp। जब आप इसे बंदरगाह पर चलाते हैं> 1023 आपके मामले में 9400) । आप आधार-यूआरआई पंजीकृत करने के लिए व्यवस्थापक निजीकरण के साथ 'नेटेश' का उपयोग कर सकते हैं और इसके बाद आपका एप्लिकेशन/एचटीपी लिस्टनर व्यवस्थापक निजीकरण के बिना चला सकता है ... – Yahia

+0

@ बाबिबू 'एचटीपी लिस्टनर' उसी आईएस घटकों का उपयोग करता है जैसे आईआईएस करता है (एक कर्नेल-मॉड्यूल कहा जाता है HTTP.SYS) ... यह खाली संदेश "निगल" नहीं करता है – Yahia