2009-08-09 7 views
6

एक सी # ऐप किसी अन्य कंप्यूटर पर मौजूद स्वयं के उदाहरण के साथ आसानी से संवाद कैसे कर सकता है, जो एक ही नेटवर्क पर है, और फ़ाइलों और डेटा को स्थानांतरित करता है?सी # ऐप आसानी से नेटवर्क पर फ़ाइलों को कैसे संचारित और स्थानांतरित कर सकता है?

नेटवर्क पर कंप्यूटर मानते हुए स्थानीय आईपी पते तय किए गए हैं, और वे प्रत्येक एक दूसरे को आईपी जानते हैं। यदि आईपी अज्ञात हैं तो संवाद करने का एक तरीका भी होगा? कुछ खोज प्रोटोकॉल के आधार पर?

मैंने सुना है कि ऐप्पल से "बोनजोर" सेवा एक अच्छा प्रोटोकॉल था। क्या हम इसके माध्यम से अपने विंडोज ऐप्स से संवाद कर सकते हैं? या आपको "सॉकेट" का उपयोग करना है। मैं मुख्य रूप से पुस्तकालयों या नमूना कोड की तलाश में हूं जो मेरी ज़रूरत को आसानी से पूरा कर सकता है, मैं अपना खुद का टीसीपी-आधारित प्रोटोकॉल या कुछ कट्टरपंथी विकसित नहीं करना चाहता!

उत्तर

2

फ़ाइलों/डेटा को स्थानांतरित करने के लिए, आप TcpClient/TcpListener कक्षाओं का उपयोग कर सकते हैं, जो ग्रिटियर सॉकेट कार्यक्षमता पर अच्छा अबास्ट्रक्शन है। या, HttpListener कक्षा का उपयोग कर आप HTTP सर्वर के रूप में एप्लिकेशन को आसानी से प्राप्त कर सकते हैं, यदि यह आपके एप्लिकेशन के लिए आसान/अधिक ऐप्रोपियेट है।

खोज के लिए, यदि आप केंद्रीय सर्वर प्राप्त करने में सक्षम हैं; तो आप प्रत्येक ग्राहक को स्टार्टअप पर सर्वर से कनेक्ट कर सकते हैं, खुद को पंजीकृत कर सकते हैं और अन्य ऑनलाइन क्लाइंट और उनके आईपी की एक सूची पुनर्प्राप्त कर सकते हैं। बाद में संचार सीधे ग्राहकों के बीच हो सकता है।

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

+0

एएसपी.Net कक्षाएं? मैं विंडोज़ ऐप्स के बीच कॉम की तलाश में था। –

+0

आपका क्या मतलब है? मेरे द्वारा उल्लेख किए जाने वाले वर्गों में से कोई भी एएसपी .NET कक्षाएं नहीं हैं। – driis

2

फ़ाइलें और सी # में सॉकेट बारे में महान बात एक अच्छा उदाहरण है कि वे दोनों धाराओं के रूप में सामने आ रहा रहे हैं। एक स्ट्रीम से दूसरे स्ट्रीम में एक बड़ी फ़ाइल की प्रतिलिपि बनाना बहुत आसान है:

byte[] data = new byte[1024]; 
while(true) { 
int bytesRead = filestream.read(data,0,data.Length); 
if (bytesRead==0) break; 
netstream.write(data,0,bytesRead); 
} 

फिर जब आप पूरा कर लें तो सॉकेट बंद करें।

यदि आप मेटाडेटा (फ़ाइल नाम, आकार) भेजना चाहते हैं या कनेक्शन बंद नहीं करना चाहते हैं, तो आपको इसे संभालने के लिए किसी प्रकार का प्रोटोकॉल चाहिए। एफ़टीपी दो अलग सॉकेट का उपयोग करता है (मेटाडेटा के लिए एक, डेटा के लिए एक; इसे बैंड ऑफ संचार कहा जाता है)। यदि आप बिना किसी फ़ायरवॉल वाले लैन पर हैं, तो यह पूरी तरह से स्वीकार्य हो सकता है। दूसरी तरफ, यदि आप इंटरनेट ट्रांसफर करना चाहते हैं, तो एक बंदरगाह खोलना मुश्किल काम है, और दो असहनीय हैं। यदि आपको प्रदर्शन के बारे में बहुत अधिक परवाह नहीं है, तो आप बेस 64 एन्कोडिंग में बाइट्स को एन्कोड कर सकते हैं, जो सुनिश्चित करता है कि वे एक निश्चित बाइट रेंज के भीतर हैं। बेस 64 के साथ, आप न्यूलाइन या अन्य गैर-अल्फान्यूमेरिक वर्णों वाले संदेशों को अलग कर सकते हैं। फिर पहले संदेश में फ़ाइल नाम, आकार, या जो कुछ भी शामिल है, फिर डेटा को दूसरे संदेश के रूप में भेजें, फिर "वह पूरी फ़ाइल है" संदेश भेजें ताकि ग्राहक जानता है कि यह हो गया है।

संदेशों के लिए एक और रणनीति एक भागने अनुक्रम का उपयोग कर रही है। उदाहरण के लिए, अपना बायस्ट्रीम लें और '\ 0' के प्रत्येक उदाहरण को '\ 0 \ 0' से बदलें। अब एंड-ऑफ-मैसेज को सिग्नल करने के लिए '\ 0 \ 1' का उपयोग करें, जो आपके डेटा संदेश में शामिल नहीं होने की गारंटी है। प्राप्त करने वाले अंत में '\ 0 \ 0' वापस '\ 0' को डीकोड करें।यह सी में काफी अच्छी तरह से काम करता है, लेकिन मुझे लगता है कि, व्यावहारिक रूप से, प्रत्येक बाइट के माध्यम से लूपिंग सी # में पूरे बफर पढ़ने से धीमी हो सकती है।

सबसे अच्छा तरीका अनुकूली-लंबाई प्रोटोकॉल को अपनाने का सबसे अच्छा तरीका है। उदाहरण के लिए, डेटा को एक निश्चित आकार के हिस्सों में भेजें (512 बाइट्स कहें)। प्रत्येक खंड से पहले, 32 बिट int को सिस्टम के माध्यम से खंड के आकार का प्रतिनिधित्व करते हुए भेजें। बिट कनवर्टर। तो संदेशों (English) इस तरह दिखेगा:

Here's 512 bytes: 
[data] 
Here's 512 bytes: 
[data] 
Here's 32 bytes: 
[data] 
Here's 4 bytes: 
That was the whole file 

लाभ यहाँ/पढ़ बफ़र्स आपके लिए काम (एक समय में 512 बाइट्स पढ़ने) आप प्रतिलिपि बना सकते हैं है, अपने प्रवाह अर्थ अपने नेटवर्क स्टैक द्वारा सीमित है आपके सी # कोड के बजाय। क्लाइंट फिक्स्ड-लम्बाई 32-बिट int पढ़ता है जो इसे अगले [डेटा] सेगमेंट के लिए उपयोग किए जाने वाले बफर के आकार को जानने देता है।

यहाँ ऐसे ही संदेश लिखने के लिए कुछ कोड है:

 logger.logger.debug("Sending message of length " + length); 
     byte[] clength = System.BitConverter.GetBytes(buffer.Length); 
     plaintextStream.Write(clength,0,clength.Length); 
     plaintextStream.Write(buffer,0,buffer.Length); 
     plaintextStream.Flush(); 

और यहाँ उन्हें पढ़ने के लिए कुछ कोड है:

   byte[] intbuf = new byte[int_32_size]; 
     int offset = 0; 
     while (offset < int_32_size) 
     { 
      int read = 0; 

      read = d.plaintextStream.Read(intbuf,offset,int_32_size - offset); 
      offset += read; 

     } 
     int msg_size = System.BitConverter.ToInt32(intbuf,0); 
     //allocate a new buffer to fill the message 
     byte[] msg_buffer = new byte[msg_size]; 
     offset = 0; 
     while (offset < msg_size) 
     { 
      int read = 0; 

      read = d.plaintextStream.Read(msg_buffer,offset,msg_size - offset); 
      offset += read; 
     } 


     return msg_buffer; 
1

फ़ाइलें आप भी फ़ाइल तुल्यकालन प्रदाता है कि को देखने के लिए चाहते हो सकता है कॉपी करने के लिए माइक्रोसॉफ्ट सिंक फ्रेमवर्क का हिस्सा। http://msdn.microsoft.com/en-us/sync/bb887623

संबंधित मुद्दे