使用c# ClientWebSocket处理流



我目前正在研究使用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?

对我来说很奇怪,微软有这么丰富的流和阅读器类集,但后来决定实现ClientWebSocket只有读取必须手动处理的字节块的能力。

假设我想传输xml,这将是很容易的,我只是包装套接字流在XmlTextReader,但这是不明显的ClientWebSocket。

为什么不使用字节数组呢?使用XmlDictionaryReader怎么样?创建extreader从System.Runtime.Serialization程序集接受字节数组。工作代码:

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);
                }
            }
        }
    }
}

对于网络操作,必须有人做等待、检查、读取、等待、理解消息结束等工作。您的示例并没有真正做到这一点,只是等到读取了1024字节后才停止。

你可以实现一个抽象流类来处理等待和读取直到"完成"的循环。记住,流只是字节数组的抽象。此外,流没有异步读/写的想法,所以如果你想要的话,你必须构建它。这里的关键是Stream需要理解套接字的底层字节,以便它知道何时读取完成。

相关内容

  • 没有找到相关文章

最新更新