Как создать веб сокет клиент на C#?

155
16 февраля 2022, 00:40

У меня есть сервер на php и webSocket клиент на js в браузере. Как создать сокет соединения с этим же сервером на C# через протокол tcp? Использую стандартную библиотеку System.Net.WebSockets.

Answer 1

Ни разу я не использовал сокеты, решил разобраться и вот что у меня получилось в итоге:

В качестве сервера для отправки возьму Echo сервер websocket.org.

  • И так, основной класс клиента для веб сокетов является ClientWebSocket, он у нас IDisposable, а значит используем using:

    using var ws = new ClientWebSocket();
    

    Я использую c# 8, по этому using у меня в одну строку.

  • Дальше смотрим какие есть методы у данного объекта и замечаем, что по сути там всего 3 метода основных (ConnectAsync(), SendAsync() и ReceiveAsync(). Давайте теперь по порядку:

    • ConnectAsync() - Подключаемся к указанному серверу, на вход принимает два параметра (Uri и CancellationToken).

      await ws.ConnectAsync(new Uri("wss://echo.websocket.org"), CancellationToken.None);
      
    • SendAsync() - Отправляет на сервер массив байтов с указанием типа отправленного сообщения. Принимает ArraySegment<byte>, WebSocketMessageType, bool и CancellationToken:

      ArraySegment<byte> arraySegment = new ArraySegment<byte>(Encoding.UTF8.GetBytes("Привет мир!"));
      await ws.SendAsync(arraySegment, System.Net.WebSockets.WebSocketMessageType.Text, true, CancellationToken.None);
      
    • ReceiveAsync() - Получает от сервера ответ. Принимает ArraySegment<byte> в качестве буфера для записи данных, а также CancellationToken.

      ArraySegment<byte> bytesReceived = new ArraySegment<byte>(new byte[1024]);
      WebSocketReceiveResult result = await ws.ReceiveAsync(bytesReceived, CancellationToken.None);
      var response = Encoding.UTF8.GetString(bytesReceived.Array, 0, result.Count);
      

Вот собственно и все, что надо для простейшей работы с веб сокетами на C#.
Из замечаний:

  1. CancellationToken - я везде использовал заглушку, для примера сойдет, а вот в проекте лучше создайте объект CancellationTokenSource, берите из него токен и работайте с ним. Иначе вы вряд-ли правильно завершите задачу.

  2. ReceiveAsync() - перед получением данных наверно стоит проверить, есть ли вообще соединение. Делается это примерно так:

    if (ws.State == WebSocketState.Open)
    {
        //Мы подключились и можем отправлять данные.
    }
    

    В интернете видел, что делают while цикл, который крутится до бесконечности, пока статус Open, тут уже смотрите сами как вам надо.

READ ALSO
Соединение проекта в Visual Studio с базой данных MS SQL Server

Соединение проекта в Visual Studio с базой данных MS SQL Server

Есть некоторое имя сервера SQL Server, например DESKTOP-1TUВ своем проекте в VS в файле App

135
Реализация сложных углов рамки

Реализация сложных углов рамки

Подскажите, пожалуйста, как правильно реализовать подобную рамку? Интересует именно форма углов, это можно сделать сделать на чистом CSS?

96
Ступор с преобразованием типов в C++ / Qt. std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;

Ступор с преобразованием типов в C++ / Qt. std::basic_string<char, std::char_traits<char>, std::allocator<char> >

Приветстсвую! Решил поработать с двоичными числами в Qt, а точнее разобраться с константами из enum'a QStyle :: StateFlag

84