为什么在 UWP 设备上 WS 通信没有收到消息?
Why is no message received in WS communication on a UWP device?
我有一个 WS 服务器,我想从该服务器(使用另一个 Web 应用程序)向连接到 session 的所有 HoloLens 设备广播消息。
首先,我在 Hololens 应用程序中实现了一个 MessageWebSocket
客户端,它启动了与示例 public 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
的行为,并回显发送的任何消息。我能够连接,连接没有关闭(从未调用 Closed),但我没有收到任何消息。
如果我使用网络浏览器(使用 chrome 的智能 Websocket 扩展)测试两个服务器,它们都可以工作。唯一的区别(也是我得到的唯一可能的线索)是示例服务器(在 Hololens 上运行的服务器)在连接时发送更多 headers:
对比我的服务器:
也许有一些更简单的方法可以做到这一点,但到目前为止我还没有找到任何适用于 UWP 的好的 WS 包装器。任何帮助表示赞赏。
毕竟我的服务器应用程序逻辑错误。所以一开始WS通信就没有问题,谢谢你的时间。
我有一个 WS 服务器,我想从该服务器(使用另一个 Web 应用程序)向连接到 session 的所有 HoloLens 设备广播消息。
首先,我在 Hololens 应用程序中实现了一个 MessageWebSocket
客户端,它启动了与示例 public 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
的行为,并回显发送的任何消息。我能够连接,连接没有关闭(从未调用 Closed),但我没有收到任何消息。
如果我使用网络浏览器(使用 chrome 的智能 Websocket 扩展)测试两个服务器,它们都可以工作。唯一的区别(也是我得到的唯一可能的线索)是示例服务器(在 Hololens 上运行的服务器)在连接时发送更多 headers:
对比我的服务器:
也许有一些更简单的方法可以做到这一点,但到目前为止我还没有找到任何适用于 UWP 的好的 WS 包装器。任何帮助表示赞赏。
毕竟我的服务器应用程序逻辑错误。所以一开始WS通信就没有问题,谢谢你的时间。