在我的应用程序中,我使用 SignalR 通过我的客户端进行消息传递。然而,该应用程序有一个到另一台服务器的 websocket 连接,用于通知如下:
var wsURL = (isSecure() ? "wss://" : "ws://") + wsEndpointURI + "?token=" + token + "&lang=" + language
+ "&uid=" + wsUid,
notifierWs = new WebSocket(wsURL);
middlewareNotifierWs.onmessage = function (event) {
var notification = JSON.parse(event.data),
msg = notification.message;
// Show the notification
};
Run Code Online (Sandbox Code Playgroud)
我想要做的是从我的 Asp.Net 应用程序建立这个连接,并通过将它们推送到正确的客户端来自己处理所有传入的消息。然而,我没有找到这种实现的例子。我发现的所有示例都是关于设置从我的服务器到客户端的 websocket 连接。(我不得不提一下,我对异步函数不是很熟悉,所以可能我有一些与这个事实相关的错误)
更新
从我发现的最好和(可能)最简单的方法是ClientWebSocket。
试图找到一些例子,我发现了这个:Websocket - Server Using HttpListener and Client With ClientWebSocket
从这个例子看来,我可以创建一个到我想要的端点的 Websocket 连接。所以这就是我所做的
public static class Program
{
private static UTF8Encoding encoding = …
Run Code Online (Sandbox Code Playgroud) 我需要在对象中设置“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) 我正在编写一个连接到websocket服务器的C#应用程序,并收到一个未知大小的JSON响应.我正在ClientWebSocket
为此目的使用该课程.
从客户端接收数据的唯一方法似乎是使用ReceiveAsync
方法,该方法ArraySegment<byte>
作为参数:
var client = new ClientWebSocket();
client.ConnectAsync(new Uri($"ws://localhost:{port}"), token).Wait();
var result = new ArraySegment<byte>(new byte[1000]);
client.ReceiveAsync(result, token).Wait();
Run Code Online (Sandbox Code Playgroud)
问题是,因为我不知道JSON响应有多大,我不知道缓冲区支持ArraySegment有多大.在这种情况下,我指定了1000个字节,这个字节太小了,并且响应被截断了.但是我担心如果我将缓冲区大小设置为任意大(1,000,000字节?),我将占用更多的内存而不是我需要的内存.
如何在不知道响应大小的情况下选择缓冲区大小?
该文档对于类的线程安全性并不清楚System.Net.WebSockets.ClientWebSocket
。
SendAsync
同时从多个线程调用该方法是否安全\xef\xbc\x9f
经过长时间的搜索,我来找你帮助我。
我有一个 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
下页所示的示例不起作用: Using c# ClientWebSocket with Streams
它挂在以下行上:
等待 ws.ConnectAsync(serverUri, CancellationToken.None);
看来连接尚未建立。
请指出使以下代码工作的最简单的修改。我不想使用任何第三方工具或库。
private static async Task DoClientWebSocket()
{
using (ClientWebSocket ws = new ClientWebSocket())
{
Uri serverUri = new Uri("wss://echo.websocket.org/");
await ws.ConnectAsync(serverUri, CancellationToken.None);
while (ws.State == WebSocketState.Open)
{
string msg = "hello123";
ArraySegment<byte> bytesToSend = new ArraySegment<byte>(Encoding.UTF8.GetBytes(msg));
await ws.SendAsync(bytesToSend, WebSocketMessageType.Text, true, CancellationToken.None);
ArraySegment<byte> bytesReceived = new ArraySegment<byte>(new byte[1024]);
WebSocketReceiveResult result = await ws.ReceiveAsync(bytesReceived, CancellationToken.None);
Console.WriteLine(Encoding.UTF8.GetString(bytesReceived.Array, 0, result.Count));
}
}
}
Run Code Online (Sandbox Code Playgroud) c# ×3
websocket ×3
.net ×2
asp.net ×1
buffer ×1
connection ×1
json ×1
networking ×1
signalr ×1