Блог им. Wolffrr

Алгопак - пример работы с вебсокетами на C#

Сделал простенький пример-код как работать с веб сокетами АлгоПака.

Работа в действии выглядит так:

Алгопак - пример работы с вебсокетами на C#

Пример кода

Класс для работы с WebSocket

<code>namespace OsaEngine.MoexAlgoPack;

using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Net.WebSockets;

public class MoexAlgoPackSocketClient(string url) : IAsyncDisposable
{
    private readonly Uri _uri = new(url);
    private readonly ClientWebSocket _clientWebSocket = new();

    public async ValueTask ConnectAsync(string domain = "DEMO", string login = "guest", string passcode = "guest", CancellationToken cancellationToken = default)
    {
        await _clientWebSocket.ConnectAsync(_uri, cancellationToken);
        await SendAsync($"CONNECT\ndomain:{domain}\nlogin:{login}\npasscode:{passcode}\n\n\0", cancellationToken);
    }

    public ValueTask SubscribeAsync(object id, string destination, string selector, CancellationToken cancellationToken = default)
    {
        return SendAsync($"SUBSCRIBE\nid:{id}\ndestination:{destination}\nselector:{selector}\n\n\0", cancellationToken);
    }

    public async ValueTask SendAsync(string message, CancellationToken cancellationToken = default)
    {
        var messageBytes = Encoding. <a name="cut"></a> UTF8.GetBytes(message);
        var segment = new ArraySegment<byte>(messageBytes);
        await _clientWebSocket.SendAsync(segment, WebSocketMessageType.Text, true, cancellationToken);
    }

    public async ValueTask ReceiveAsync(Action<string> received, CancellationToken cancellationToken = default)
    {
        var buffer = new byte[1024 * 4];

        while (_clientWebSocket.State == WebSocketState.Open)
        {
            var result = await _clientWebSocket.ReceiveAsync(new(buffer), cancellationToken);

            if (result.MessageType == WebSocketMessageType.Close)
            {
                await _clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, default);
            }
            else
            {
                var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
                received(message);
            }
        }
    }

    public async ValueTask CloseAsync()
    {
        await _clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", default);
        _clientWebSocket.Dispose();
    }

    ValueTask IAsyncDisposable.DisposeAsync()
    {
        GC.SuppressFinalize(this);
        return CloseAsync();
    }
}
</code>

Пример использования

<code>var client = new MoexAlgoPackSocketClient("wss://iss.moex.com/infocx/v3/websocket");
await client.ConnectAsync("passport", "<email>", "<password>");

_ = Task.Run(async () =>
{
    await Task.Yield();
    await client.ReceiveAsync(Console.WriteLine);
});

await Task.Delay(2000);
await client.SubscribeAsync(Guid.NewGuid(), "MXSE.orderbooks", "TICKER=\"MXSE.TQBR.SBER\"");

Console.ReadLine();

await client.CloseAsync();
</code>
Заключение

Оригинал статья разместил у себя на сайте https://osaengine.ru/2024/07/01/moex-algopack-csharp-websocket.html

6 комментариев
Чё Оби-Ван еще один сайт открыл чтобы соревноваться самому с собой?
avatar
Beach Bunny, как же меня это сравнением уже огорчает.

Нет, со Старой Школой у меня нет никаких пересечений. У меня сайт-каталог. Они — обучающая компания и продажа роботов. Из общего только акроним, по разному раскрывающийся.

Не пишите про них. У владельца школы свое представление о мире, он думает что я хочу завладеть его ноунейм проектом. Не хочу даже связываться с ним. Пусть живет и сделает свой проект популярным, только желаю ему успехов. Главное, чтобы вокруг меня не распространял ложь.
Gambler, а зачем тогда сделал похожее наименование и иконки ?
Чтобы поисковый трафик тырить у них, на тех кто ошибется в наименовании ???
avatar
Beach Bunny, домену 100 лет в обед. Я его давно планировал под этот сайт. Название придумал сам, хотя это обще популярное название, конечно. Логотип мой совершенно не схож с их. Можете посмотреть профиль на этом сайте, какой они используют лого и какой я использую.

Зачем мне это всё? Трафик на сайт у меня выше чем у них если верить их статистике. Тем более что коммерцией я не планирую заниматься.
Gambler, ок, но лучше бы иметь другое название, чтобы не получать постоянные лучи поноса от Оби-вана.
p.s.
Я так понимаю, он про тебя писал что тебя забанили в чате Алора
avatar
Beach Bunny, с Алор я связался и объяснил ситуацию. Чтобы не тревожить никого, возвращения в чат не просил и он мне не требуется. Я получил разрешение от Алор публиковать их новости у себя на сайте, и это всё, что мне нужно было от того чата.

Насчет названия — оно и так другое. У них Старая Школа. У меня — Открытые Коды. То, что акроним получается одинаковый, это нормально. OS распространенная абревиатура. Например, это операционная система. Это неправильно что кто-то под себя требует единолично такой акроним. А если бы они API или SDK сделали у себя в имени? Что, теперь никому больше нельзя иметь такое название?

теги блога Gambler <osaengine.ru>

....все тэги



UPDONW
Новый дизайн