web-dev-qa-db-fra.com

Connexion à websocket à l'aide de C # (je peux me connecter à l'aide de JavaScript, mais C # donne une erreur de code d'état 200)

Je suis nouveau dans le domaine du websocket. 

Je peux me connecter au serveur websocket en utilisant JavaScript en utilisant ce code:

var webSocket = new WebSocket(url);

Mais pour mon application, je dois me connecter au même serveur en utilisant c #. Le code que j'utilise est:

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

La 3ème ligne du code résulte de l'erreur suivante:

"Le serveur a renvoyé le code d'état 200 alors que le code d'état 101 était attendu"

Après un peu d'enquête, j'ai réalisé que le serveur ne peut pas basculer le protocole http vers le protocole websocket pendant le processus de connexion.

Est-ce que je fais quelque chose de stupide dans mon code C # ou quelque chose ne va pas avec le serveur. Je n'ai aucun accès au serveur, car l'URL que j'utilise est une tierce partie.

Pourriez-vous s'il vous plaît me faire des suggestions concernant la question?

11
Jahangir Alam

Utilisez la bibliothèque WebSocketSharp et connectez-vous facilement:

Client 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);
      }
    }
  }
}

Étape 1

Espace de noms requis.

using WebSocketSharp;

La classe WebSocket existe dans l'espace de noms WebSocketSharp.

Étape 2

Création d'une nouvelle instance de la classe WebSocket avec l'URL WebSocket à connecter.

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

La classe WebSocket hérite de l'interface System.IDisposable. Vous pouvez donc utiliser l'instruction using. Et la connexion WebSocket sera fermée avec le statut de fermeture 1001 (disparition) lorsque le contrôle quitte le bloc using.

Étape 3

Définition des événements WebSocket.

WebSocket.OnOpen événement

Un événement WebSocket.OnOpen se produit lorsque la connexion WebSocket a été établie.

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

e est passé en tant que System.EventArgs.Empty, vous n’avez donc pas besoin de l’utiliser.

WebSocket.OnMessage événement

Un événement WebSocket.OnMessage se produit lorsque WebSocket reçoit un message.

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

e est passé en tant que WebSocketSharp.MessageEventArgs.

e.Type property renvoie soit WebSocketSharp.Opcode.Text ou WebSocketSharp.Opcode.Binary qui représente le type du message. Donc, en le vérifiant, vous pouvez déterminer quel article vous devriez utiliser.

S'il renvoie Opcode.Text, vous devez utiliser la propriété e.Data qui renvoie une chaîne (représente le message texte).

Ou, si elle renvoie Opcode.Binary, vous devez utiliser la propriété e.RawData qui renvoie un octet [] (représente le message binaire).

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

  return;
}

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

  return;
}

WebSocket.OnError événement

Un événement WebSocket.OnError se produit lorsque WebSocket obtient une erreur.

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

e a passé comme un WebSocketSharp.ErrorEventArgs.

la propriété e.Message renvoie une chaîne représentant le message d'erreur.

Si l'erreur est due à une exception, la propriété e.Exception renvoie une instance System.Exception à l'origine de l'erreur.

WebSocket.OnClose événement

Un événement WebSocket.OnClose se produit lorsque la connexion WebSocket a été fermée.

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

e a passé comme un WebSocketSharp.CloseEventArgs.

la propriété e.Code renvoie un ushort qui représente le code de statut indiquant le motif de la fermeture, et la propriété e.Reason renvoie une chaîne représentant le motif de la fermeture.

Étape 4

Connexion au serveur WebSocket.

ws.Connect ();

Si vous souhaitez vous connecter au serveur de manière asynchrone, vous devez utiliser la méthode WebSocket.ConnectAsync ().

Étape 5

Envoi de données au serveur WebSocket.

ws.Send (data);

La méthode WebSocket.Send est surchargée.

Vous pouvez utiliser la méthode WebSocket.Send (string), WebSocket.Send (byte[]) ou WebSocket.Send (System.IO.FileInfo) pour envoyer les données.

Si vous souhaitez envoyer les données de manière asynchrone, vous devez utiliser la méthode WebSocket.SendAsync.

ws.SendAsync (data, completed);

De plus, si vous souhaitez faire quelque chose lorsque l'envoi est terminé, vous devez définir le paramètre terminé sur un délégué Action<bool>.

Étape 6

Fermer la connexion WebSocket.

ws.Close (code, reason);

Si vous souhaitez fermer explicitement la connexion, vous devez utiliser la méthode WebSocket.Close.

La méthode WebSocket.Close est surchargée.

Vous pouvez utiliser les méthodes WebSocket.Close (), WebSocket.Close (ushort), WebSocket.Close (WebSocketSharp.CloseStatusCode), WebSocket.Close (ushort, chaîne) ou WebSocket.Close (WebSocketSharp.CloseStatusCode, chaîne) pour fermer le lien.

Si vous souhaitez fermer la connexion de manière asynchrone, vous devez utiliser la méthode WebSocket.CloseAsync.

28

Si vous vous connectez avec un client WebSocket et que vous obtenez une réponse HTTP 200, cela signifie que vous vous connectez probablement au mauvais endroit (hôte, chemin et/ou port).

Fondamentalement, vous vous connectez à un point de terminaison HTTP normal qui ne comprend pas votre exigence WebSocket et renvoie simplement la réponse "OK" (HTTP 200). Le serveur WebSocket s'exécute probablement sur un autre port ou chemin du même serveur. 

Vérifiez votre URL.

2
vtortola

Les URL de Websocket doivent commencer par ws:// ou wss://, ce dernier étant sécurisé Websocket.

0
Babu James