2015-05-27 7 views
10

मैं .NET 4.5 और बाद में (विंडोज 8.1 पर) नए System.Net.WebSockets कक्षाओं के साथ एक साधारण चैट सर्वर को कार्यान्वित करना चाहता हूं। हालांकि, मुझे केवल एएसपी.NET पर्यावरण में उन वर्गों का उपयोग करने के उदाहरण मिलते हैं (विशेष रूप से यहां: http://www.codemag.com/Article/1210051)ASP.NET के बिना System.Net.WebSockets के साथ कैसे काम करें?

मेरे पास ऐसा कोई नहीं है, और वेबसेट सर्वर को "कच्चे" के रूप में लागू करना चाहते हैं संभव है, लेकिन सभी वेबसाइकिल प्रोटोकॉल को फिर से लागू किए बिना माइक्रोसॉफ्ट उम्मीद है कि पहले ही .NET 4.5 में ऐसा किया है।

मैंने सोचा कि WebSocket कक्षा को तुरंत चालू करने जैसा मैंने सामान्य Socket के साथ किया था, लेकिन कन्स्ट्रक्टर संरक्षित है। इसलिए मैं इसे प्राप्त करने वाली कक्षा बनाने के लिए गया, लेकिन फिर मैंने देखा कि मुझे इतनी सारी अमूर्त विधियों और गुणों को लागू करना था, ऐसा लगता है कि मैं पूरे तर्क को फिर से लिख रहा हूं (विशेष रूप से क्योंकि मुझे State या SendAsync जैसी चीजों को लागू करना था)।

मुझे डर है कि एमएसडीएन दस्तावेज ने मेरी मदद नहीं की है। प्रलेखन में प्री-रिलीज स्थिति है और कई टिप्पणियां सिर्फ "टीबीडी" या "जब इसे कार्यान्वित की जाती हैं" कहती हैं।

+0

संभावित डुप्लिकेट [सी # एसएसएल वेबसॉकेट क्लाइंट में है जो .NET 4.0 है?] (Http://stackoverflow.com/questions/13386604/is-there-in-c-sharp-ssl-websocket-client- that-is-net-4-0) – MethodMan

+1

हाँ, ऐसा लगता है कि System.Net.WebSocket प्रकार सुंदर संदर्भ केंद्रित हैं .. विशेष रूप से HttpContext ऑब्जेक्ट http://www.codeproject.com/Articles/618032/Using-WebSocket- इन-नेट-पार्ट .. ने कहा, System.Net.WebSockets को होस्टिंग वेबसॉकेट सर्वर के लिए असेंबली के लिए प्रतीत नहीं होता है .. –

+0

यहां कुछ संदर्भ लिंक (एमडीएन) है: सामान्य जानकारी - https: //developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_servers सी # वेबसॉकेटसेवर कार्यान्वयन (.NET 4.5 वेबसाकेट्स का उपयोग नहीं करता है) https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_server। मैं वर्तमान में वीबीएनईटी कोड नमूना साफ कर रहा हूं .. मैंने इसे चालू किया एक मसौदे के रूप में थोड़ी देर पहले। इसे कोई संशोधन नहीं मिला है। –

उत्तर

5

मैं बस this link पर ठोकर खा रहा हूं जो दिखाता है कि को केवल System.Net.WebSockets कार्यान्वयन का उपयोग करके कैसे कार्यान्वित किया जाए। हैंडलर की आवश्यकता है क्योंकि .NET WebSocket कार्यान्वयन आईआईएस 8+ पर निर्भर है।

using System; 
using System.Web; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Net.WebSockets; 

namespace AspNetWebSocketEcho 
{ 
    public class EchoHandler : IHttpHandler 
    { 
     public void ProcessRequest(HttpContext context) 
     { 
      if (context.IsWebSocketRequest) 
       context.AcceptWebSocketRequest(HandleWebSocket); 
      else 
       context.Response.StatusCode = 400; 
     } 

     private async Task HandleWebSocket(WebSocketContext wsContext) 
     { 
      const int maxMessageSize = 1024; 
      byte[] receiveBuffer = new byte[maxMessageSize]; 
      WebSocket socket = wsContext.WebSocket; 

      while (socket.State == WebSocketState.Open) 
      { 
       WebSocketReceiveResult receiveResult = await socket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None); 

       if (receiveResult.MessageType == WebSocketMessageType.Close) 
       { 
        await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None); 
       } 
       else if (receiveResult.MessageType == WebSocketMessageType.Binary) 
       { 
        await socket.CloseAsync(WebSocketCloseStatus.InvalidMessageType, "Cannot accept binary frame", CancellationToken.None); 
       } 
       else 
       { 
        int count = receiveResult.Count; 

        while (receiveResult.EndOfMessage == false) 
        { 
         if (count >= maxMessageSize) 
         { 
          string closeMessage = string.Format("Maximum message size: {0} bytes.", maxMessageSize); 
          await socket.CloseAsync(WebSocketCloseStatus.MessageTooLarge, closeMessage, CancellationToken.None); 
          return; 
         } 

         receiveResult = await socket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer, count, maxMessageSize - count), CancellationToken.None); 
         count += receiveResult.Count; 
        } 

        var receivedString = Encoding.UTF8.GetString(receiveBuffer, 0, count); 
        var echoString = "You said " + receivedString; 
        ArraySegment<byte> outputBuffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(echoString)); 

        await socket.SendAsync(outputBuffer, WebSocketMessageType.Text, true, CancellationToken.None); 
       } 
      } 
     } 

     public bool IsReusable 
     { 
      get { return true; } 
     } 
    } 
} 

आशा है कि इससे मदद मिलेगी!

8

हां।

HTTPListener का उपयोग करने का सबसे आसान तरीका है। यदि आप HTTPListener WebSocket की खोज करते हैं तो आपको बहुत सारे उदाहरण मिलेंगे।

संक्षेप में (छद्म कोड)

HTTPListener httpListener = new HttpListener(); 
httpListener.Prefixes.Add("http://localhost/"); 
httpListener.Start(); 

HTTPListenerContext context = await httpListener.GetContextAsync(); 
if (context.Request.IsWebSocketRequest) 
{ 
    HTTPListenerWebSocketContext webSocketContext = await context.AcceptWebSocketAsync(null); 
    WebSocket webSocket = webSocketContext.WebSocket; 
    while (webSocket.State == WebSocketState.Open) 
    { 
     await webSocket.SendAsync(...); 
    } 
} 

.NET 4.5 और Windows 8 या बाद में की आवश्यकता है।

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