Windows Universal (IoT) Websocket сервер для вещания - PullRequest
0 голосов
/ 16 мая 2019

Мне нужно что-то вроде библиотеки Websocket Sharp для Windows Universal.Я пытаюсь построить сервер на Windows 10 IoT, чтобы транслировать некоторые данные (температура и другие события), и я хочу создать что-то вроде стримера для трансляции данных в реальном времени от Arduino.В samples я могу найти только инструкции по созданию клиента websocket.Есть идеи?

1 Ответ

1 голос
/ 16 мая 2019

Универсальная платформа Windows (UWP) обеспечивает поддержку использования WebSockets как на клиенте, так и на сервере.Вы можете найти библиотеку с именем IoTWeb , которая позволяет встроить простой сервер HTTP и WebSocket в ваше приложение UWP.Эта библиотека предоставляет простой HTTP-сервер с поддержкой WebSocket.

class WebSocketHandler : IWebSocketRequestHandler
{
    private Dictionary<string,WebSocket> _webSockets = new Dictionary<string, WebSocket>();
    public event MessageRecivedHandler MessageRecived;
    private IdHelper _portMappings;

    public WebSocketHandler(IdHelper portMappings)
    {
        _portMappings = portMappings;
    }



    public void Connected(WebSocket socket)
    {
        var guid = Guid.NewGuid().ToString();
        _webSockets.Add(guid, socket);


        socket.DataReceived += (webSocket, frame) => MessageRecived?.Invoke(_webSockets.First(x => x.Value == webSocket).Key,webSocket, frame);
        socket.ConnectionClosed += (webSocket) =>
        {
            var connection = _webSockets.First(s => s.Value == webSocket);
            _webSockets.Remove(connection.Key);
        };

        if (_portMappings.IsBindingPosible())
        {
            _portMappings.Bind(guid);

            var message = new ServerMessage()
            {
                ClientID = guid,
                Command = "Init",
                Value = _portMappings.CheckBinding(guid).ToString()
            };
            SendMessage(guid, message);
        }
        else
        {
            var message = new ServerMessage()
            {
                ClientID = guid,
                Command = "Init",
                Value = "Max Number Of Clients Reached. Please close connection"
            };
            SendMessage(guid, message);
        }


    }

    public bool WillAcceptRequest(string uri, string protocol)
    {
        return true;
    }

    public async Task BroadcastMessage(string message)
    {
        await ThreadPool.RunAsync((workItem) => _webSockets?.AsParallel().ForAll(webSocket => webSocket.Value.Send(message)));
    }

    public async Task SendMessage(string guid, ServerMessage message)
    {
        await ThreadPool.RunAsync((workItem) => _webSockets?.First(x => x.Key == guid).Value.Send(JsonConvert.SerializeObject(message)));
    }
    public delegate void MessageRecivedHandler(string guid, WebSocket socket, string message);
}
...