फ़ाइलें और सी # में सॉकेट बारे में महान बात एक अच्छा उदाहरण है कि वे दोनों धाराओं के रूप में सामने आ रहा रहे हैं। एक स्ट्रीम से दूसरे स्ट्रीम में एक बड़ी फ़ाइल की प्रतिलिपि बनाना बहुत आसान है:
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;
एएसपी.Net कक्षाएं? मैं विंडोज़ ऐप्स के बीच कॉम की तलाश में था। –
आपका क्या मतलब है? मेरे द्वारा उल्लेख किए जाने वाले वर्गों में से कोई भी एएसपी .NET कक्षाएं नहीं हैं। – driis