【问题标题】:Windows Universal (IoT) Websocket server to broadcastingWindows 通用 (IoT) Websocket 服务器到广播
【发布时间】:2019-05-15 22:58:54
【问题描述】:

我需要类似于库 Websocket Sharp 到 Windows Universal 的东西。我试图在 Windows 10 IoT 上构建服务器来广播一些数据(温度和其他事件),我想构建类似流媒体的东西来广播来自 Arduino 的实时数据。 在samples 我只能找到制作 websocket 客户端的说明。有任何想法吗?

【问题讨论】:

    标签: c# win-universal-app windows-10-iot-core


    【解决方案1】:

    通用 Windows 平台 (UWP) 支持客户端和服务器使用 WebSocket。你可能会发现一个名为 IoTWeb 的库,它允许你将一个简单的 HTTP 和 WebSocket 服务器嵌入到你的 UWP 应用程序中。这个库提供了一个简单的支持 WebSocket 的 HTTP 服务器。

    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);
    }
    

    【讨论】:

    • 有没有可能告诉我你在这个类中究竟使用了哪些命名空间?我有一些冲突。
    • @Kamil,WebSocketHandler 不在库中,它是一个自定义处理程序,继承自 IWebSocketRequestHandler 以满足您的要求。
    • 致所有搜索“树莓派上的Windows IoT”主题信息的人:不要浪费时间。我不知道是什么原因,但是 RBPi 上的 Windows 10 IoT 会让你生气,甚至可能会发疯。有很多意想不到的错误、错误和自动重启。只需使用 Raspbian,如果必须 - docker。这就是你所需要的。我浪费了大约 5 天的时间来让它工作。
    猜你喜欢
    • 2016-02-24
    • 2015-08-08
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 2018-11-14
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多