Jak pracować z gniazdami internetowymi w .Net

Gniazdo sieciowe to połączenie za pośrednictwem gniazda TCP między klientem a serwerem. Zasadniczo gniazdo sieciowe to dwukierunkowa komunikacja w pełnym dupleksie między klientem a serwerem za pośrednictwem sieci. Rosnące zapotrzebowanie na przesyłanie w czasie rzeczywistym wiadomości o małych opóźnieniach zarówno w aplikacjach internetowych, jak i mobilnych doprowadziło do pojawienia się gniazd sieciowych. Jest to protokół, który umożliwia zapewnienie szybkiej, dwukierunkowej komunikacji w czasie rzeczywistym w aplikacjach bez konieczności narażania użytkownika na szwank.

WebSockets to protokół oparty na komunikatach, który korzysta z połączenia strumieniowego TCP. Przestrzeń nazw System.Net.WebSockets zapewnia obsługę pracy z gniazdami internetowymi w .Net. Należy zauważyć, że połączenie gniazda sieciowego między serwerem a aplikacją kliencką jest nawiązywane poprzez wymianę uzgadniania HTTP między nimi.

MSDN stwierdza: „WebSockets umożliwiają przeglądarkom otwieranie dwukierunkowego, pełnodupleksowego kanału komunikacyjnego z usługami. Każda strona może następnie użyć tego kanału do natychmiastowego przesyłania danych do drugiej strony. Teraz witryny od sieci społecznościowych i gier do witryn finansowych mogą zapewniać lepsze scenariusze czasu rzeczywistego, najlepiej przy użyciu tych samych znaczników w różnych przeglądarkach ”.

Możesz dowiedzieć się więcej o protokole WebSocket tutaj.

Praca z WebSockets w .Net

Podczas hostowania gniazd internetowych po stronie serwera przy użyciu .Net masz kilka możliwości. Serwer WebSocket można hostować w tradycyjnych aplikacjach ASP.Net lub ASP.Net MVC. Aby to zrobić, musisz skorzystać z HttpContext.AcceptWebSocketRequest. Następnie można mieć aplikację internetową po stronie klienta, która będzie łączyć się z gniazdem internetowym i komunikować się w celu wymiany wiadomości. Możesz również utworzyć usługę WCF, która używa netHttpBinding i skorzystać z CallbackContract w swojej usłudze. Następnie możesz skorzystać z HttpContext.AcceptWebSocketRequest lub nawet skorzystać z WebSocketHandler lub WebSocketHost dostępnych jako część Microsoft.WebSockets.dll.

Po stronie klienta możesz wykorzystać HTML5 i jQuery na swojej stronie internetowej. Możesz również wykorzystać klasę ClientWebSocket, aby utworzyć aplikację kliencką, a nawet użyć klienta WCF do połączenia się z gniazdem internetowym.

Zauważ, że obiekt HttpContext teraz (od .Net Framework 4.5) zawiera nową właściwość o nazwie IsWebSocketRequest. Możesz skorzystać z tej właściwości obiektu HttpContext, aby sprawdzić, czy przychodzące żądanie jest żądaniem gniazda internetowego. Poniższa lista kodu pokazuje, jak utworzyć gniazdo sieci Web przy użyciu HttpHandler.

public class Service : IHttpHandler

   {

       public void ProcessRequest(HttpContext context)

       {

           if (context.IsWebSocketRequest)

               context.AcceptWebSocketRequest(ProcessRequestInternal);

           else

               context.Response.StatusCode = 400;

       }

       public bool IsReusable

       {

           get

            {

               return false;

           }

       }

       private async Task ProcessRequestInternal(AspNetWebSocketContext context)

       {

           WebSocket socket = context.WebSocket;

             while(true)

           {

               //Write your code here to process the request

           }

       }

   }

Należy zarejestrować moduł obsługi HTTP w pliku web.config aplikacji. Oto fragment kodu, który pokazuje, jak należy to zrobić.

  

    

           type="Web.Handler"/>

  

You can also use web sockets in your Web API controllers. Incidentally, ASP.Net Web API is a lightweight framework used for building RESTful services that run on HTTP. RESTful services are light-weight, stateless, client-server based, cacheable services that are based on the concept of resources. The following code snippet illustrates how you can implement a web socket in your Web API controller method -- note the usage of HttpContext.AcceptWebSocketRequest to accept and establish connections.

public class WebSocketController : ApiController

{

       [HttpGet]

       public HttpResponseMessage GetMessage()

       {

           if (HttpContext.Current.IsWebSocketRequest)

           {

               HttpContext.Current.AcceptWebSocketRequest(ProcessRequestInternal);

           }

           return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);

       }

          private async Task ProcessRequestInternal(AspNetWebSocketContext context)

          {

          //Write your code here to process the request

         }

}

At the client side, you would need to connect to the web socket by specifying the URI used to send the WebSocket connection request.

var webSocket = new WebSocket("ws://" + window.location.hostname +

                   "/Web/api/WebSocket");

                   webSocket.onopen = function () {

                   $("#status").text("Connected...");

               };

You can also take advantage of the new Microsoft.Web.WebSockets.WebSocketHandler class to implement web sockets now. To use this class, you would need to install the Microsoft.WebSockets package via NuGet Package Manager. Alternatively, you can install the same package by running the following command in the NuGet Package Manager Console.

Install-Package Microsoft.WebSockets

The following code snippet shows how you can extend the WebSocketHandler class to create your own custom handler.

public class WebSocketHandler : WebSocketHandler

   {

       private static WebSocketCollection socketClients = new WebSocketCollection();

       public override void OnOpen()

       {

           socketClients.Add(this);

           socketClients.Broadcast("This is for all connected clients...");

           this.Send("Hello from: " + this.WebSocketContext.UserHostAddress);

       }

       public override void OnClose()

       {

           base.OnClose();

       }

       public override void OnError()

       {

           base.OnError();

        }

   }