Подключение к websocket с помощью C# (я могу подключиться с помощью JavaScript, но C# дает код состояния 200 ошибка)

Я новичок в области websocket.

Я могу подключиться к серверу websocket с помощью JavaScript, используя этот код:

var webSocket = new WebSocket(url);

но для моего приложения мне нужно подключиться к тому же серверу с помощью c#. Код, который я использую:

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

3-я строка кода приводит к следующей ошибке:

"сервер вернул код состояния 200, когда ожидался код состояния 101"

после небольшого опроса я понял, что каким-то образом сервер не может переключить протокол http на протокол websocket во время процесса подключения.

Я делаю что-то глупое в своем коде C# или что-то не так с сервером. У меня нет доступа к серверу, так как url, который я использую, является сторонним .

не могли бы вы дать мне какие-либо предложения по этому вопросу?

3 ответов


использовать библиотека WebSocketSharp и подключить легко:

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

Шаг 1

требуемое пространство имен.

using WebSocketSharp;

класс WebSocket существует в пространстве имен WebSocketSharp.

Шаг 2

создание нового экземпляра класса WebSocket с URL-адресом WebSocket для соединять.

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

класс WebSocket наследует систему.Интерфейс IDisposable, поэтому вы можете использовать оператор using. И соединение WebSocket будет закрыто с состоянием закрытия 1001 (уходит), когда элемент управления покидает блок using.

Шаг 3

настройка событий WebSocket.

WebSocket.OnOpen событие

A WebSocket.OnOpen событие происходит, когда соединение было установленный.

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

e прошел как System.EventArgs.Empty, так что вам не нужно использовать его.

WebSocket.OnMessage событие

A WebSocket.OnMessage событие происходит, когда WebSocket получает сообщение.

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

e has passed as a WebSocketSharp.MessageEventArgs.

e.Type property возвращает либо WebSocketSharp.Код операции.Текст или WebSocketSharp.Код операции.Двоичный файл, представляющий тип сообщения. Поэтому, проверив его, вы можете определить, какой элемент вы должны использовать.

если он возвращает код операции.Текст, вы должны использовать e.Свойство Data, возвращающее строку (представляет текстовое сообщение).

или если он возвращается Opcode.Binary, вы должны использовать e.Свойство RawData, возвращающее байт [] (представляет двоичное сообщение).

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 прошел как WebSocketSharp.ErrorEventArgs.

e.Свойство Message возвращает строку, представляющую сообщение об ошибке.

если ошибка вызвана исключением, e.Свойство Exception возвращает значение System.Exception экземпляр, вызвавший ошибка.

WebSocket.OnClose событие

WebSocket.Onclose событие происходит, когда соединение WebSocket было закрыто.

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

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) метод отправки данных.

если вы хотите отправлять данные асинхронно, вы должны использовать Вебсокетов.Метод SendAsync.

ws.SendAsync (data, completed);

а также, если вы хотите что-то сделать, когда отправка завершена, вы должны установить completed в any Action<bool> делегат.

Шаг 6

закрытие соединения WebSocket.

ws.Close (code, reason);

если вы хотите, чтобы явно закрыть соединение, вы должны использовать WebSocket.Close метод.

WebSocket.Метод Close перегружен.

вы можете использовать Вебсокетов.Close (), WebSocket.Close (ushort), WebSocket.Закрыть (WebSocketSharp.CloseStatusCode), WebSocket.Закрыть (ushort, string) или WebSocket.Закрыть (WebSocketSharp.CloseStatusCode, string) метод для закрытия соединения.

если вы хотите закрыть соединение асинхронно, вы должны использовать WebSocket.CloseAsync метод.


Если вы подключаетесь к клиенту WebSocket и получаете HTTP 200 в качестве ответа, это означает, что вы, вероятно, подключаетесь к неправильному месту (хост, путь и/или порт).

в основном, вы подключаетесь к обычной конечной точке HTTP, которая не понимает ваше требование WebSocket, и она просто возвращает ответ "OK" (HTTP 200). Вероятно, сервер WebSocket работает в другом порту или пути на том же сервере.

проверьте свой URL.


url Websocket должны начинаться с ws:// или wss:// где последний является безопасным websocket.