Connexion à la connexion Web en utilisant C # (je peux me connecter en utilisant JavaScript, mais C # donne l'erreur Status 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 ma demande, 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); 

3ème ligne du code suite à une erreur:

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

Après un peu de sondage, je me suis rendu compte que d'une façon ou d'une autre, le serveur ne peut pas passer le protocole http au 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 me donner une suggestion concernant le problème?

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

WebSocket Client

 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 à se connecter.

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

La classe WebSocket hérite de l'interface System.IDisposable, de sorte que vous pouvez utiliser l'instruction using. Et la connexion WebSocket sera fermée avec l'état de fermeture 1001 (disparaître) lorsque la commande quitte le bloc d'utilisation.

Étape 3

Définir les événements WebSocket.

Événement WebSocket.OnOpen

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

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

E a passé comme System.EventArgs.Empty , donc vous n'avez pas besoin de l'utiliser.

Événement WebSocket.OnMessage

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

 ws.OnMessage += (sender, e) => { ... }; e has passed as a WebSocketSharp.MessageEventArgs. 

e.Type property renvoie WebSocketSharp.Opcode.Text ou WebSocketSharp.Opcode.Binary qui représente le type de message. Donc, en le vérifiant, vous pouvez déterminer quel élément vous devez utiliser.

Si elle 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` Event A `WebSocket.OnError` event occurs when the WebSocket gets an error. ws.OnError += (sender, e) => { ... }; 

E est passé en tant que WebSocketSharp.ErrorEventArgs .

La propriété e.Message renvoie une chaîne qui représente le message d'erreur.

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

WebSocket.OnClose Event

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

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

E a passé comme WebSocketSharp.CloseEventArgs .

La propriété e.Code renvoie un ushort qui représente le code d'état indiquant le motif de la fermeture, et la propriété e.Reason renvoie une chaîne qui représente 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 façon asynchrone, vous devez utiliser la méthode WebSocket.SendAsync.

 ws.SendAsync (data, completed); 

Et aussi, si vous souhaitez faire quelque chose lorsque l'envoi est terminé, vous devez définir complété à n'importe quel délégué Action<bool> .

Étape 6

Fermeture de la connexion WebSocket.

 ws.Close (code, reason); 

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

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

Vous pouvez utiliser la méthode WebSocket.Close (), WebSocket.Close (ushort), WebSocket.Close (WebSocketSharp.CloseStatusCode), WebSocket.Close (ushort, string) ou WebSocket.Close (WebSocketSharp.CloseStatusCode, chaîne) pour fermer le connexion.

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

Si vous vous connectez avec un client WebSocket et que vous recevez un HTTP 200 comme réponse, cela signifie que vous vous connectez probablement au mauvais endroit (hôte, chemin d'accès et / ou port).

Fondamentalement, vous vous connectez à un point d'extrémité HTTP normal qui ne comprend pas votre requête WebSocket, et il retourne simplement la réponse "OK" (HTTP 200). Probablement, le serveur WebSocket s'exécute dans un autre port ou chemin d'accès dans le même serveur.

Vérifiez votre URL.