2010-02-06 18 views
60

कहा जाता है, मैं एक सी # वेब सॉकेट सर्वर को लागू करने की कोशिश कर रहा हूं, लेकिन यह मुझे कुछ परेशानी दे रहा है। मैं जावास्क्रिप्ट के साथ पृष्ठ होस्ट करने के लिए एक वेबसर्वर (एएसपी.नेट) चला रहा हूं और वेब सॉकेट सर्वर को सी # कंसोल एप्लिकेशन के रूप में कार्यान्वित किया गया है।वेबस्केट सर्वर: वेब सॉकेट पर ऑनपेन फ़ंक्शन को कभी भी

मैं क्लाइंट से कनेक्शन प्रयास का पता लगाने में सक्षम हूं (क्रोम जावास्क्रिप्ट चला रहा है) और क्लाइंट से हैंडशेक पुनर्प्राप्त करने के लिए भी। लेकिन क्लाइंट उस हैंडशेक को स्वीकार नहीं कर रहा है जिसे मैं वापस भेज रहा हूं (वेब ​​सॉकेट पर onopen फ़ंक्शन कभी नहीं कहा जाता है)।

मैं The Web Socket protocol पढ़ रहा हूं और मैं नहीं देख सकता कि मैं क्या गलत कर रहा हूं। यहाँ सर्वर कोड का एक सा:

Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8181); 
listener.Bind(ep); 
listener.Listen(100); 
Console.WriteLine("Wainting for connection..."); 
Socket socketForClient = listener.Accept(); 
if (socketForClient.Connected) 
{ 
    Console.WriteLine("Client connected"); 
    NetworkStream networkStream = new NetworkStream(socketForClient); 
    System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream); 
    System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream); 

    //read handshake from client: 
    Console.WriteLine("HANDSHAKING..."); 
    char[] shake = new char[255]; 
    streamReader.Read(shake, 0, 255); 

    string handshake = 
     "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" + 
     "Upgrade: WebSocket\r\n" + 
     "Connection: Upgrade\r\n" + 
     "WebSocket-Origin: http://localhost:8080\r\n" + 
     "WebSocket-Location: ws://localhost:8181\r\n" + 
     "\r\n"; 

    streamWriter.Write(handshake); 
    streamWriter.Flush(); 

मैं पोर्ट 8080 और बंदरगाह 8181 पर वेब सॉकेट सर्वर पर वेब सर्वर पर चल रहा हूँ, दोनों मेरे स्थानीय होस्ट पर।

मैंने विभिन्न एन्कोडिंग (ASCII, बाइट्स और हेक्स) में हैंडशेक भेजने की कोशिश की है, लेकिन ऐसा कोई फर्क नहीं पड़ता है। कनेक्शन पूरी तरह से स्थापित नहीं है। जावास्क्रिप्ट इस तरह दिखता है:

var ws; 
var host = 'ws://localhost:8181'; 
debug("Connecting to " + host + " ..."); 
try { 
ws = new WebSocket(host); 
} catch (err) { 
debug(err, 'error'); 
} 
ws.onopen = function() { 
debug("connected...", 'success'); 
}; 
ws.onclose = function() { 
debug("Socket closed!", 'error'); 
}; 
ws.onmessage = function (evt) { 
debug('response: ' + evt, 'response'); 
}; 

मेरा अनुमान है कि उस त्रुटि क्रोम के रूप में एकदम सही ढंग से जानकारी भेज रहा है सी # सर्वर में निहित है, लेकिन जैसा कि एक ने कहा onopen समारोह कभी नहीं कहा जाता है।

तो मेरा प्रश्न संक्षेप में: क्या आप में से कोई भी इसे पूरा कर चुका है - और यदि हां, तो आपने यह कैसे किया? और कारण: क्या आपको कोड में कोई स्पष्ट त्रुटियां दिखाई देती हैं (उम्मीद है कि पूछने के लिए बहुत कुछ नहीं है)

+1

आप फ्लेक उपयोग कर सकते हैं का उपयोग करता है लगता है, उपलब्ध NuGet पर: http://nuget.org/packages/Fleck/ –

उत्तर

47

शायद यह एक एन्कोडिंग समस्या है।

class Program 
{ 
    static void Main(string[] args) 
    { 
     var listener = new TcpListener(IPAddress.Loopback, 8181); 
     listener.Start(); 
     using (var client = listener.AcceptTcpClient()) 
     using (var stream = client.GetStream()) 
     using (var reader = new StreamReader(stream)) 
     using (var writer = new StreamWriter(stream)) 
     { 
      writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake"); 
      writer.WriteLine("Upgrade: WebSocket"); 
      writer.WriteLine("Connection: Upgrade"); 
      writer.WriteLine("WebSocket-Origin: http://localhost:8080"); 
      writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession"); 
      writer.WriteLine(""); 
     } 
     listener.Stop(); 
    } 
} 

और इसी ग्राहक localhost:8080 पर होस्ट:: यहाँ एक काम सी # सर्वर मैंने लिखा है

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <script type="text/javascript"> 
     var socket = new WebSocket('ws://localhost:8181/websession'); 
     socket.onopen = function() { 
     alert('handshake successfully established. May send data now...'); 
     }; 
     socket.onclose = function() { 
     alert('connection closed'); 
     }; 
    </script> 
    </head> 
    <body> 
    </body> 
</html> 

यह उदाहरण केवल हाथ मिलाना स्थापित करता है। एक बार हैंडशेक स्थापित होने के बाद डेटा को स्वीकार करना जारी रखने के लिए आपको सर्वर को ट्विक करने की आवश्यकता होगी।

+1

धन्यवाद! यह पता चला कि यह हैंडशेक का वेबसॉकेट-स्थान हिस्सा था जो मुझे परेशानी दे रहा था। जाहिर है यह सिर्फ 'ws: // localhost: 8181' नहीं हो सकता है। इसे 'ws: // localhost: 8181/कुछ' में बदलने के बाद और जावास्क्रिप्ट में मेजबान को एक ही चीज़ में बदलना - यह काम करता है। –

+0

पोस्ट के लिए धन्यवाद। मैं क्रोम + के साथ एक स्थैतिक एचटीएमएल फ़ाइल के साथ प्रयास कर रहा था और ब्राउजर को तुरंत डिस्कनेक्ट करने से रोकने के लिए मूल को बदलना पड़ा: लेखक। राइटलाइन ("वेबसॉकेट-उत्पत्ति: फ़ाइल: //"); –

+0

@Darin आपका कोड ठीक काम कर रहा है। यह तब काम नहीं करता जब मैंने इसे "उपयोग" हटा दिया और सामान्य रूप से "लेखक" घोषित किया। बात यह है कि लेखक ने ग्राहक को वापस नहीं लिखा था। क्या आप इसे समझा सकते हैं? – prabhakaran

24

कृपया टेक्स्ट संदेश भेजने के लिए यूटीएफ 8 एन्कोडिंग का उपयोग करें।

एक ओपन सोर्स वेबस्केट सर्वर है जिसे सी # द्वारा कार्यान्वित किया गया है, आप इसे सीधे उपयोग कर सकते हैं।

http://superwebsocket.codeplex.com/

यह मेरी ओपन सोर्स प्रोजेक्ट है!

+2

अब है, सुपरवेबसेट में वेबसाकेट क्लाइंट कार्यान्वयन भी शामिल है! –

3

.NET Framework 4.5 विंडोज संचार फाउंडेशन में वेबस्केट्स के लिए समर्थन प्रस्तुत करता है। वेबसाकेट एक कुशल, मानक-आधारित तकनीक है जो मानक HTTP पोर्ट 80 और 443 पर द्विदिश संचार को सक्षम बनाता है। मानक HTTP पोर्ट्स का उपयोग वेबसाकेट्स को मध्यस्थों के माध्यम से वेब पर संवाद करने की अनुमति देता है। वेबसाकेट परिवहन पर संचार का समर्थन करने के लिए नए मानक बाइंडिंग जोड़े गए हैं। NetHttp बाइंडिंग और NetHttps बाइंडिंग। वेबसाकेट-विशिष्ट सेटिंग्स को HttpTransportBinding तत्व पर WebSocketSettings संपत्ति तक पहुंचकर कॉन्फ़िगर किया जा सकता है।

मैं यह अभी भी सोप हालांकि

http://msdn.microsoft.com/en-us/library/hh674271(v=vs.110).aspx

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