将c#ClientWebSocket与流一起使用

时间:2016-08-12 11:40:06

标签: c# websocket

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

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

对我来说很奇怪,微软拥有这套丰富完善的流和读者类,但后来决定实现ClientWebSocket只能读取必须手动处理的字节块。

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

1 个答案:

答案 0 :(得分:1)

对于网络操作,有人必须做等待,检查,阅读,等待,理解消息结束等工作。你的例子并没有真正做到这一点,但只是等到读取了1024个字节,然后停下来。

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