Как десериализовать ArraySegment<byte> в object внутри WebSocke

242
26 декабря 2017, 14:19

Как десериализовать ArraySegment в object внутри WebSocke? Я закоментировал часть кода в которой пытался это сделать, к примеру я пытался использовать такую конструкцию:

    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream(buffer.Array);
    getMsg = bf.Deserialize(ms);

но она разрывает веб сокет и соответственно не подходит, я ее и в отдельном треде юзал и что только не пробовал. Слышал, что мою проблему можно решить с помощью SignalR но примеров так и не нашел

private async Task WebSocketRequest(AspNetWebSocketContext context)
    {
        // Получаем сокет клиента из контекста запроса
        var socket = context.WebSocket;
        // Добавляем его в список клиентов
            Locker.EnterWriteLock();
            Clients.Add(socket);
            Locker.ExitWriteLock();
        // Слушаем его
        while (true)
        {
            var buffer = new ArraySegment<byte>(new byte[1024]);
            // Ожидаем данные от него
            var result = await socket.ReceiveAsync(buffer, CancellationToken.None);
            using (MemoryStream ms = new MemoryStream(buffer.Array))
            {
                IFormatter br = new BinaryFormatter();
                getMsg=(object)br.Deserialize(ms);
            }
            //Thread SerializeThread = new Thread(delegate ()
            //{
            //    BinaryFormatter bf = new BinaryFormatter();
            //    MemoryStream ms = new MemoryStream(buffer.Array);
            //    getMsg = bf.Deserialize(ms);
            //});
            //SerializeThread.Priority = ThreadPriority.Normal;
            //SerializeThread.Start();

            //var segment = new ArraySegment<byte>(buffer.Array, 24, buffer.Array.Length);
            //var stream = new MemoryStream(segment.Array, segment.Offset, segment.Count);
            //BinaryFormatter bf = new BinaryFormatter();
            //MemoryStream ms = new MemoryStream(buffer.Array);
            //object obj = bf.Deserialize(ms);

            //Dialog dlg= obj as Dialog;
            //db.Dialogs.Add(dlg);
            //db.SaveChangesAsync();
            //Передаём сообщение всем клиентам
            for (int i = 0; i < Clients.Count; i++)
            {
                WebSocket client = Clients[i];
                try
                {
                    if (client.State == WebSocketState.Open)
                    {
                        await client.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                    }
                }
                catch (ObjectDisposedException)
                {
                    Locker.EnterWriteLock();
                    try
                    {
                        Clients.Remove(client);
                        i--;
                    }
                    finally
                    {
                        Locker.ExitWriteLock();
                    }
                }
            }
        }
    }
READ ALSO
Получить дочерний элемент UI в Unity?

Получить дочерний элемент UI в Unity?

Как у canvas в unity через скрипт получить его дочерний button, чтобы потом иметь возможность обращаться к нему и проверять на нажатия ? Пробовал так:

264
TcpClient hook close connect

TcpClient hook close connect

Подскажите есть ли обработчик closeconnect TcpClient?Нужен для вывода информации о дисконнекте

245
C# Доступ к строке из ресурса культуры

C# Доступ к строке из ресурса культуры

В C# (windows forms) добавил новый язык к форме, изменил текст компонентов и тд, создался файл ресурсов для языка который добавил, добавил свою строку...

214
Скачивание файла с проверкой наличия и хеша

Скачивание файла с проверкой наличия и хеша

Использую библиотеку CefSharpСтолкнулась с проблемой обновления файлов

266