2015-05-29 8 views
7

मैं websocket के क्षेत्र में नया हूं।सी # का उपयोग कर वेबस्केट से कनेक्ट करना (मैं जावास्क्रिप्ट का उपयोग कर कनेक्ट कर सकता हूं, लेकिन सी # स्टेटस कोड 200 त्रुटि देता है)

मैं इस कोड का उपयोग जावास्क्रिप्ट का उपयोग सर्वर WebSocket से कनेक्ट कर सकते हैं:

var webSocket = new WebSocket(url); 

लेकिन मेरे आवेदन के लिए, मैं सी # का उपयोग कर एक ही सर्वर से कनेक्ट करने की जरूरत है। कोड मैं का उपयोग कर रहा है:

ClientWebSocket webSocket = null; 
webSocket = new ClientWebSocket(); 
await webSocket.ConnectAsync(new Uri(url), CancellationToken.None); 

कोड परिणामों के 3 लाइन निम्न त्रुटि:

"Server returned status code 200 when status code 101 was expected"

सर्वेक्षण के छोटा सा के बाद, मुझे एहसास हुआ कि किसी भी तरह सर्वर प्रोटोकॉल WebSocket को http प्रोटोकॉल परिवर्तन नहीं कर सकते कनेक्शन प्रक्रिया के दौरान।

क्या मैं अपने सी # कोड में बेवकूफ कुछ कर रहा हूं या सर्वर के साथ कुछ गलत हो रहा है। मेरे पास सर्वर तक कोई पहुंच नहीं है, क्योंकि यूआरएल मैं उपयोग कर रहा हूं एक तीसरी पार्टी है।

क्या आप मुझे इस मुद्दे के बारे में कोई सुझाव दे सकते हैं?

उत्तर

12

उपयोग WebSocketSharp library और आसानी से कनेक्ट:

WebSocket ग्राहक

using System; 
using WebSocketSharp; 

namespace Example 
{ 
    public class Program 
    { 
    public static void Main (string[] args) 
    { 
     using (var ws = new WebSocket ("ws://dragonsnest.far/Laputa")) { 
     ws.OnMessage += (sender, e) => 
      Console.WriteLine ("Laputa says: " + e.Data); 

     ws.Connect(); 
     ws.Send ("BALUS"); 
     Console.ReadKey (true); 
     } 
    } 
    } 
} 

चरण 1

आवश्यक नाम स्थान।

using WebSocketSharp; 

WebSocket वर्ग WebSocketSharp नाम स्थान में मौजूद है।

चरण 2

कनेक्ट करने के लिए WebSocket यूआरएल के साथ WebSocket वर्ग का एक नया उदाहरण बना रहा है।

using (var ws = new WebSocket ("ws://example.com")) { 
    ... 
} 

वेबसॉकेट क्लास System.IDisposable इंटरफ़ेस को विरासत में लेता है, ताकि आप उपयोग कथन का उपयोग कर सकें। और वेबस्केट कनेक्शन बंद स्थिति 1001 (दूर जा रहा है) के साथ बंद हो जाएगा जब नियंत्रण ब्लॉक का उपयोग छोड़ देता है।

चरण 3

WebSocket घटनाओं की स्थापना।

WebSocket.OnOpen घटना

एक WebSocket.OnOpen घटना तब होती है जब WebSocket कनेक्शन स्थापित किया गया है।

ws.OnOpen += (sender, e) => { 
    ... 
}; 

System.EventArgs.Empty के रूप में पारित कर दिया है, ताकि आप इसे उपयोग करने की आवश्यकता नहीं है।

WebSocket.OnMessage घटना

एक WebSocket.OnMessage घटना तब होती है जब WebSocket संदेश प्राप्त करता है।

ws.OnMessage += (sender, e) => { 
    ... 
}; 

e has passed as a WebSocketSharp.MessageEventArgs. 

e.Type property रिटर्न या तो WebSocketSharp.Opcode.Text या WebSocketSharp.Opcode.Binary कि संदेश की प्रकृति का प्रतिनिधित्व करता है। तो इसे जांचकर, आप यह निर्धारित कर सकते हैं कि आपको किस आइटम का उपयोग करना चाहिए।

यह Opcode.Text देता है, तो आप e.Data संपत्ति है कि एक स्ट्रिंग (पाठ संदेश का प्रतिनिधित्व करता है) देता है का उपयोग करना चाहिए।

या यदि यह Opcode.Binary देता है, तो आपको ई.रॉडाटा संपत्ति का उपयोग करना चाहिए जो बाइट [] (बाइनरी संदेश का प्रतिनिधित्व करता है) देता है।

if (e.Type == Opcode.Text) { 
    // Do something with e.Data. 
    ... 

    return; 
} 

if (e.Type == Opcode.Binary) { 
    // Do something with e.RawData. 
    ... 

    return; 
} 
`WebSocket.OnError` Event 

A `WebSocket.OnError` event occurs when the WebSocket gets an error. 

ws.OnError += (sender, e) => { 
    ... 
}; 

WebSocketSharp.ErrorEventArgs के रूप में पारित किया गया है।

e.Message संपत्ति एक स्ट्रिंग है त्रुटि संदेश का प्रतिनिधित्व करता है देता है।

त्रुटि एक अपवाद की वजह से है, तो e.Exception संपत्ति एक System.Exception उदाहरण है कि त्रुटि के कारण देता है।

WebSocket.OnClose घटना

एक WebSocket.OnClose घटना तब होती है जब WebSocket कनेक्शन बंद कर दिया गया है।

ws.OnClose += (sender, e) => { 
    ... 
}; 

WebSocketSharp.CloseEventArgs के रूप में पारित हो गया है।

e.Code संपत्ति एक ushort कि करीब के लिए कारण का संकेत स्थिति कोड का प्रतिनिधित्व करता है देता है, और e.Reason संपत्ति एक स्ट्रिंग है कि बंद के लिए कारण का प्रतिनिधित्व करता है देता है।

चरण 4

WebSocket सर्वर से कनेक्ट हो।

ws.Connect(); 

आप एसिंक्रोनस रूप से सर्वर से कनेक्ट करना चाहते हैं, तो आप WebSocket.ConnectAsync() विधि का उपयोग करना चाहिए।

चरण 5

WebSocket सर्वर से डेटा भेजा जा रहा।

ws.Send (data); 

WebSocket.Send विधि अधिभारित है।

आप डेटा भेजने के लिए WebSocket.Send (string), WebSocket.Send (byte[]), या WebSocket.Send (System.IO.FileInfo) विधि का उपयोग कर सकते हैं।

आप एसिंक्रोनस रूप से डेटा भेजने के लिए चाहते हैं, तो आप WebSocket.SendAsync विधि का उपयोग करना चाहिए।

ws.SendAsync (data, completed); 

और यह भी अगर आप कुछ करने के लिए जब भेजने पूरा हो गया है चाहते हैं, आप किसी भी Action<bool> प्रतिनिधि को पूरा स्थापित करना चाहिए।

चरण 6

WebSocket कनेक्शन बंद।

ws.Close (code, reason); 

आप स्पष्ट रूप से कनेक्शन बंद करना चाहते हैं, तो आप WebSocket.Close विधि का उपयोग करना चाहिए।

WebSocket.Close विधि अधिभारित है।

आप WebSocket.Close(), WebSocket.Close (ushort), WebSocket.Close (WebSocketSharp.CloseStatusCode), WebSocket.Close (ushort, स्ट्रिंग), उपयोग कर सकते हैं WebSocket.Close (WebSocketSharp.CloseStatusCode, स्ट्रिंग) कनेक्शन बंद करने के लिए विधि।

यदि आप कनेक्शन को असीमित रूप से बंद करना चाहते हैं, तो आपको WebSocket.CloseAsync विधि का उपयोग करना चाहिए।

+0

पैकेज मैनेजर कंसोल में स्थापित-पैकेज WebSocketSharp –

+0

धन्यवाद आपके तरह के उत्तर के लिए जगदीश। मैंने अपने यूआरएल के साथ कोड ब्लॉक चलाया, लेकिन यह त्रुटि के बाद परिणाम देता है: "त्रुटि | websocket.dohandshake | कोई वेबसाइकिल कनेक्शन प्रतिक्रिया नहीं है"। मुझे यकीन नहीं है कि क्या हो रहा है। मैंने जो किया वह Nuget Console का उपयोग करके WebSocketSharp के पूर्व-रिलीज़ संस्करण को जोड़ा गया था और मेरे यूआरएल का उपयोग कर प्रोग्राम चलाया। जैसा कि मैंने पहले कहा था, मैं अभी भी जावास्क्रिप्ट का उपयोग कर वेबस्केट सर्वर से कनेक्ट कर सकता हूं। कोई सोच? –

+0

कृपया मुझे आंतरिक अपवाद और स्टैकट्रैक जैसे त्रुटि के बारे में अधिक जानकारी दें .. स्क्रीन शॉट बेहतर होगा @ जहांगीरएलम –

2

यदि आप किसी वेबसॉकेट क्लाइंट से कनेक्ट करते हैं और आपको HTTP 200 प्रतिक्रिया के रूप में मिलता है, तो इसका मतलब है कि शायद आप गलत स्थान (होस्ट, पथ और/या पोर्ट) से कनेक्ट हो रहे हैं।

असल में, आप एक सामान्य HTTP एंडपॉइंट से कनेक्ट हो रहे हैं जो आपकी वेबसॉकेट आवश्यकता को समझ नहीं रहा है, और यह सिर्फ "ठीक" प्रतिक्रिया (HTTP 200) को वापस कर रहा है। शायद वेबसॉकेट सर्वर एक ही सर्वर में किसी अन्य पोर्ट या पथ में चलता है।

अपना यूआरएल जांचें।

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