मैं सी # में क्लाइंट/सर्वर एप्लिकेशन लिख रहा हूं, और यह बढ़िया जा रहा है। अभी के लिए, सब कुछ काम करता है और यह सब बहुत मजबूत है। मेरी समस्या यह है कि कनेक्शन में पैकेट भेजते समय मैं कुछ देरी में भाग जाता हूं।टीसीपी क्लाइंट का उपयोग करके संवाद करने का तेज़ तरीका?
ग्राहक पक्ष पर मैं यह कर रहा हूँ:
NetworkStream ns = tcpClient.GetStream();
// Send packet
byte[] sizePacket = BitConverter.GetBytes(request.Length);
byte[] requestWithHeader = new byte[sizePacket.Length + request.Length];
sizePacket.CopyTo(requestWithHeader, 0);
request.CopyTo(requestWithHeader, sizePacket.Length);
ns.Write(requestWithHeader, 0, requestWithHeader.Length);
// Receive response
ns.Read(sizePacket, 0, sizePacket.Length);
int responseLength = BitConverter.ToInt32(sizePacket, 0);
byte[] response = new byte[responseLength];
int bytesReceived = 0;
while (bytesReceived < responseLength)
{
int bytesRead = ns.Read(response, bytesReceived, responseLength - bytesReceived);
bytesReceived += bytesRead;
}
सर्वर विपरीत है (कुछ अपवाद आदि को पकड़ने बाहर छोड़ दिया), यह NetworkStream.Read() जब तक यह एक पूरी है पर ब्लॉक यानी अनुरोध करें, फिर इसे संसाधित करें और लिखें() का उपयोग करके प्रतिक्रिया भेजता है।
लिखने की कच्ची गति()/पढ़ें() एक समस्या नहीं है (यानी बड़े पैकेट भेजना तेज है), लेकिन कई छोटे पैकेट भेजना, एक के बाद एक कनेक्शन को बंद किए बिना, बहुत धीमा हो सकता है 50-100 एमएस)। अजीब बात यह है कि ये देरी सामान्य पिंग टाइम्स < 1 एमएस के साथ लैन कनेक्शन पर दिखाई देती हैं, लेकिन यदि सर्वर स्थानीयहोस्ट पर चल रहा है, तो वे तब नहीं होते हैं, भले ही पिंग समय प्रभावी ढंग से समान हो (कम से कम अंतर नहीं होना चाहिए 100 एमएस के आदेश पर)। यह मुझे समझ में आएगा कि अगर मैं हर पैकेट पर कनेक्शन दोबारा खोल रहा था, जिससे बहुत सारे हैंडशेकिंग हुए, लेकिन मैं नहीं हूं। ऐसा लगता है जैसे सर्वर एक प्रतीक्षा स्थिति में जा रहा है, इसे क्लाइंट के साथ सिंक से बाहर फेंकता है, और फिर यह थोड़ा सा ठोकर खा जाता है क्योंकि यह अनिवार्य रूप से खोया कनेक्शन क्या है।
तो, क्या मैं इसे गलत कर रहा हूं? क्या TcpServer और TcpClient सिंक्रनाइज़ किए गए कनेक्शन को रखने का कोई तरीका है ताकि सर्वर हमेशा डेटा प्राप्त करने के लिए तैयार हो? (और इसके विपरीत: कभी-कभी क्लाइंट से अनुरोध को संसाधित करने में कुछ एमएस लगते हैं, और तब क्लाइंट सर्वर से प्रतिक्रिया प्राप्त करने के लिए तैयार नहीं लगता है जब तक कि इसे पढ़ने पर अवरुद्ध करने के बाद जागने के कुछ क्षण नहीं होते हैं() ।)
क्या आपने स्ट्रीमरिएडर का उपयोग करने की जिज्ञासा से बाहर किया? –
कोई विशेष कारण नहीं है कि आप [डब्ल्यूसीएफ] (http://msdn.microsoft.com/en-us/netframework/aa663324) का उपयोग क्यों नहीं कर रहे हैं? इस ढांचे में सब कुछ करने की कोशिश कर रहा है और अधिक निर्मित है। – Jay
इसके विपरीत आईएमओ; डब्ल्यूसीएफ बेहद फूला हुआ है, और ज्यादातर लोग केवल इसका एक छोटा सा अंश उपयोग करते हैं। कच्चे सॉकेट अक्सर ठीक होते हैं, और आमतौर पर काफी अधिक कुशल होते हैं। –