我目前正在开发一种System.Net.WebSockets实现,该实现将使用蜂窝网络实时发送有关设备的数据包。使用蜂窝网络意味着我的解决方案应该能够在网络偶尔失去连接时重新连接套接字。我能够做到这一点的唯一方法是创建一个新实例,ClientWebSocket然后异步发送连接消息。
这不是我的确切代码,但希望它能够让我明白我正在尝试做的事情。
void PublisherConnect()
{
myWebSocket = new ClientWebSocket();
Task.Run(async () =>
{
if (myWebSocket.ConnectionState != WebSocketState.Open)
{
try
{
await myWebSocket.ConnectAsync(HostString);
}
catch (WebSocketException ee)
{
Debug.WriteLine(ee.Message);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
internal async Task ConnectAsync(Uri uri)
{
using (var cts = new CancellationTokenSource())
{
try
{
await myWebSocket.ConnectAsync(uri, CancellationToken.None);
manualState = false;
}
catch (Exception)
{
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在完全断开连接后尝试再次与同一对象连接,则会抛出错误并显示消息“Websocket 已启动”。我不明白 WebSocket 的哪些内容?
编辑 - 我正在将其构建到 NuGet 包中,以用作其他应用程序的库,因此由于程序将如何使用此功能,我需要保留在 .NET 4.6 周围。
我需要在对象中设置“User-Agent”HTTP 标头ClientWebSocket,但这是不可能的。虽然有一个ClientWebSocket.SetRequestHeader(header,value),但如果我尝试设置该标头,该方法将失败:System.ArgumentException: This header must be modified using the appropriate property or method.
查看ClientWebSocket源代码,似乎MS人完全忘记了这一点:
// System.Net.WebSockets.ClientWebSocket
private HttpWebRequest CreateAndConfigureRequest(Uri uri)
{
HttpWebRequest httpWebRequest = WebRequest.Create(uri) as HttpWebRequest;
if (httpWebRequest == null)
{
throw new InvalidOperationException(SR.GetString("net_WebSockets_InvalidRegistration"));
}
foreach (string name in this.options.RequestHeaders.Keys)
{
httpWebRequest.Headers.Add(name, this.options.RequestHeaders[name]);
}
if (this.options.RequestedSubProtocols.Count > 0)
{
httpWebRequest.Headers.Add("Sec-WebSocket-Protocol", string.Join(", ", this.options.RequestedSubProtocols));
}
if (this.options.UseDefaultCredentials)
{
httpWebRequest.UseDefaultCredentials = true;
}
else
{
if (this.options.Credentials != null)
{
httpWebRequest.Credentials = this.options.Credentials;
} …Run Code Online (Sandbox Code Playgroud) 经过长时间的搜索,我来找你帮助我。
我有一个 WPF 应用程序,使用 ClientWebSocket 类(使用 System.Net.WebSockets)连接到 WebSocket 服务器(NodeJS)。我的应用程序正在运行后台 Windows 应用程序,它第一次连接,然后在 1 分钟的计时器内尝试重新连接(如果尚未连接)。但是当我禁用连接(网络连接)时,我的应用程序没有检测到,所以每 1 分钟告诉我它已连接。我知道我的代码有问题,我不知道如何实现一个事件处理程序,以便在连接丢失(websocket 关闭)时得到通知。
我注意到当我连接到服务器时,我必须创建一个会话,然后我收到一个 session_id,现在我连接到了 websocket 服务器。
Class1 是一个库类,我使用 WebSockets 类
class1
{
ClientWebSocket web_socket;
bool connected = false;
public async Task<bool> connect_socket()
{
Object result_object;
string session_id;
try
{
if (connected == false)
{
web_socket = new ClientWebSocket();
web_socket.Options.SetRequestHeader("headername", "headerValue");
await web_socket.ConnectAsync(new Uri(" ... uri....."), CancellationToken.None);
create_session();
ArraySegment<byte> byte_received = new ArraySegment<byte>(new byte[1024]);
WebSocketReceiveResult json_notify_result = await web_socket.ReceiveAsync(byte_received, CancellationToken.None);
string string_notify = Encoding.UTF8.GetString(byte_received.Array);
json_notify = JsonConvert.DeserializeObject<Dictionary<string, …Run Code Online (Sandbox Code Playgroud) c# connection networking system.net.websockets clientwebsocket