gpt4 book ai didi

c# - 将 c# ClientWebSocket 与流一起使用

转载 作者:可可西里 更新时间:2023-11-01 03:02:15 33 4
gpt4 key购买 nike

我目前正在研究使用 websockets 在客户端/代理和服务器之间进行通信,并决定为此目的使用 C#。尽管我之前使用过 Websockets 和 C#,但这是我第一次同时使用这两者。第一次尝试使用以下指南: http://www.codeproject.com/Articles/618032/Using-WebSocket-in-NET-Part

public static void Main(string[] args)
{
Task t = Echo();
t.Wait();
}

private static async Task Echo()
{
using (ClientWebSocket ws = new ClientWebSocket())
{
Uri serverUri = new Uri("ws://localhost:49889/");
await ws.ConnectAsync(serverUri, CancellationToken.None);
while (ws.State == WebSocketState.Open)
{
Console.Write("Input message ('exit' to exit): ");
string msg = Console.ReadLine();
if (msg == "exit")
{
break;
}
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));
}
}
}

虽然这似乎按预期工作,但我想知道是否有任何方法可以将 .NET 中的内置流/读取器与 ClientWebSocket 一起使用?

我觉得奇怪的是,Microsoft 拥有一套丰富且完善的流和读取器类,但随后决定实现 ClientWebSocket,它只能读取必须手动处理的字节 block 。

假设我想传输 xml,将套接字流包装在 XmlTextReader 中对我来说很容易,但这对于 ClientWebSocket 并不明显。

最佳答案

为什么不使用字节数组?使用 XmlDictionaryReader.CreateTextReader which accept byte array from System.Runtime.Serialization assembly? 怎么样? . Working code :

namespace XmlReaderOnByteArray
{
using System;
using System.Xml;

class Program
{
public static void Main(string[] args)
{
// Some XML
string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>";
// Get buffer from string
ArraySegment<byte> arraySegment = new ArraySegment<byte>(System.Text.Encoding.UTF8.GetBytes(xml));
// Use XmlDictionaryReader.CreateTextReader to create reader on byte array
using (var reader = XmlDictionaryReader.CreateTextReader(arraySegment.Array, new XmlDictionaryReaderQuotas())) {
while (reader.Read()) {
Console.WriteLine("{0}[{1}] => {2}", reader.Name, reader.NodeType, reader.Value);
}
}
}
}
}

关于c# - 将 c# ClientWebSocket 与流一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38917094/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com