【发布时间】:2019-08-21 13:15:00
【问题描述】:
我有一个 WS 服务器,我想从该服务器(使用另一个 Web 应用程序)向连接到会话的所有 HoloLens 设备广播消息。
首先,我在 Hololens 应用程序中实现了一个 MessageWebSocket 客户端,它启动了与示例公共 WS 服务器 echo.websocket.org 的连接,只是为了检查客户端的设置是否正确。代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if WINDOWS_UWP
using System.Threading.Tasks;
using Windows.Networking.Sockets;
using Windows.Storage.Streams;
using Windows.Web;
using System;
#endif
public class WebSocketClient : MonoBehaviour
{
void Start()
{
#if WINDOWS_UWP
int msgTime = 5;
int fadeTime = 1;
guiPhraseReporter.QueueRaport("START", msgTime, fadeTime);
MessageWebSocket ws = new MessageWebSocket();
ws.Control.MessageType = SocketMessageType.Utf8;
ws.MessageReceived += (MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) =>
{
guiPhraseReporter.QueueRaport("Trying to receive message...", msgTime, fadeTime);
try
{
using (DataReader dataReader = args.GetDataReader())
{
dataReader.UnicodeEncoding = UnicodeEncoding.Utf8;
string message = dataReader.ReadString(dataReader.UnconsumedBufferLength);
Debug.Log(message);
}
}
catch (Exception ex)
{
Debug.Log("Error occurred");
}
};
ws.Closed += (IWebSocket sender, WebSocketClosedEventArgs args) => {
Debug.Log("WS closed");
};
try
{
Task connectTask = ws.ConnectAsync(new Uri("ws://echo.websocket.org")).AsTask();
connectTask.ContinueWith(async _ =>
{
string message = "Hello, World!";
using (DataWriter dataWriter = new DataWriter(ws.OutputStream))
{
dataWriter.WriteString(message);
await dataWriter.StoreAsync();
dataWriter.DetachStream();
}
Debug.Log("Sending Hello World");
});
}
catch (Exception ex)
{
WebErrorStatus webErrorStatus = WebSocketError.GetStatus(ex.GetBaseException().HResult);
// Add additional code here to handle exceptions.
Debug.Log(ex);
}
#endif
}
}
它工作正常,我能够向服务器发送一条消息,它被回显并被客户端正确接收。
但是,当我使用将要测试的实际服务器时,事情就会变得一团糟。在我的服务器上,我复制了 echo.websocket.org 的行为,并回显了发送的任何消息。我可以连接,连接没有关闭(从未调用关闭),但我没有收到任何消息。
如果我使用网络浏览器(使用 chrome 的智能 Websocket 扩展)测试两个服务器,它们都可以工作。唯一的区别(也是我得到的唯一可能的线索)是示例服务器(在 Hololens 上工作的服务器)在连接时发送更多标头:
vs 我的服务器:
也许有一些更简单的方法可以做到这一点,但到目前为止,我还没有找到任何可以在 UWP 上工作的好的 WS 包装器。任何帮助表示赞赏。
【问题讨论】:
-
这可能与线程有关吗?您是否尝试设置 Brakepoints 并调试代码?
标签: c# unity3d websocket uwp hololens