Файл общего доступа WebSocket для нескольких клиентов, использующий ядро. net - PullRequest
0 голосов
/ 05 марта 2020

Я хочу поделиться файлом с несколькими клиентами, используя WebSocket ... Я получаю код, который отправляет сообщение нескольким клиентам .. Я хочу эту функцию для обмена файлами .. Я тоже новичок. net, поэтому не понял как это сделать ..

     public class ChatWebSocketMiddleware
{
    private static ConcurrentDictionary<string, WebSocket> _sockets = new ConcurrentDictionary<string, WebSocket>();

    private readonly RequestDelegate _next;

    public ChatWebSocketMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (!context.WebSockets.IsWebSocketRequest)
        {
            await _next.Invoke(context);
            return;
        }

        CancellationToken ct = context.RequestAborted;
        WebSocket currentSocket = await context.WebSockets.AcceptWebSocketAsync();
        var socketId = Guid.NewGuid().ToString();

        _sockets.TryAdd(socketId, currentSocket);

        while (true)
        {
            if (ct.IsCancellationRequested)
            {
                break;
            }

            var response = await ReceiveStringAsync(currentSocket, ct);
            if (string.IsNullOrEmpty(response))
            {
                if (currentSocket.State != WebSocketState.Open)
                {
                    break;
                }

                continue;
            }

            foreach (var socket in _sockets)
            {
                if (socket.Value.State != WebSocketState.Open)
                {
                    continue;
                }

                await SendStringAsync(socket.Value, response, ct);
            }
        }

        WebSocket dummy;
        _sockets.TryRemove(socketId, out dummy);

        await currentSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", ct);
        currentSocket.Dispose();
    }

    private static Task SendStringAsync(WebSocket socket, string data, CancellationToken ct = default(CancellationToken))
    {
        var buffer = Encoding.UTF8.GetBytes(data);
        var segment = new ArraySegment<byte>(buffer);
        return socket.SendAsync(segment, WebSocketMessageType.Text, true, ct);
    }

    private static async Task<string> ReceiveStringAsync(WebSocket socket, CancellationToken ct = default(CancellationToken))
    {
        var buffer = new ArraySegment<byte>(new byte[8192]);
        using (var ms = new MemoryStream())
        {
            WebSocketReceiveResult result;
            do
            {
                ct.ThrowIfCancellationRequested();

                result = await socket.ReceiveAsync(buffer, ct);
                ms.Write(buffer.Array, buffer.Offset, result.Count);
            }
            while (!result.EndOfMessage);

            ms.Seek(0, SeekOrigin.Begin);
            if (result.MessageType != WebSocketMessageType.Text)
            {
                return null;
            }

            // Encoding UTF8: https://tools.ietf.org/html/rfc6455#section-5.6
            using (var reader = new StreamReader(ms, Encoding.UTF8))
            {
                return await reader.ReadToEndAsync();
            }
        }
    }
}

вот промежуточное ПО, которое я использую

Класс запуска

     var webSocket = new WebSocketOptions
        {
            KeepAliveInterval = TimeSpan.FromSeconds(20),
            ReceiveBufferSize = 6 * 1024
        };
        app.UseWebSockets(webSocket); 
        app.UseMiddleware<ChatWebSocketMiddleware>(); //for message chat

с использованием java сценарий на стороне клиента

вот так я отправляю файл на сервер

     function sendFile() {


        var file = document.getElementById('filename').files[0];

        var reader = new FileReader();


        var rawData = new ArrayBuffer();

        reader.loadend = function() {

        }

        reader.onload = function (e) {
            console.log(e.target);
            rawData = e.target.result;
            console.log(rawData);

            ws.send(rawData);

            alert("the File has been transferred.")

        }

        reader.readAsArrayBuffer(file);

    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...