【问题标题】:Buffor filled by nulls. Websockets .net core由空值填充的缓冲区。 Websockets .net 核心
【发布时间】:2017-08-08 11:43:31
【问题描述】:

我在 .net core 和 Angular 中构建了实时聊天等应用程序。 一切正常,但是,存储接收到的消息的缓冲区在内容之后有空字节。

我的缓冲区大小为 1024 字节。 但是如果消息有例如 60 个字节,则其余部分由空值填充。

我是否应该将收到的消息重写到新的缓冲区(具有适当的大小),然后只发送这个新的缓冲区? (我现在用的这个方法)

以下是我的接收方法:

private async Task Recive(WebSocket socket, Action<WebSocketReceiveResult, byte[]> handle) //original 
{   
    while(socket.State == WebSocketState.Open)
    {
        var buffer = new byte[1024];
        var result = await socket.ReceiveAsync
        (
            buffer: new ArraySegment<byte>(buffer),
            cancellationToken: CancellationToken.None
        );

        handle(result, buffer);
    }
}

Handle 是应用接收数据后调用的函数。

【问题讨论】:

    标签: c# .net asp.net-mvc websocket asp.net-core


    【解决方案1】:

    缓冲区就是一个缓冲区,因此如果它比实际数据大,它不会自动调整大小。你可以试试:

    private async Task Receive(WebSocket socket, Action<WebSocketReceiveResult, byte[]> handle) //original 
    {   
        while(socket.State == WebSocketState.Open)
        {
            var buffer = new ArraySegment<byte>(new byte[1024]);
            var result = await socket.ReceiveAsync
            (
                buffer: buffer,
                cancellationToken: CancellationToken.None
            );
    
            var resized = new byte[buffer.Count];
            Array.Copy(buffer.Array, buffer.Offset, resized, 0, buffer.Count);
            handle(result, resized);
        }
    }
    

    请注意,如果您收到大于 1024 字节的消息,您的代码将无法工作。您可以在此处检查检索消息完整内容的正确方法(以及如何进一步处理它):https://stackoverflow.com/a/23784968/2698119

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      相关资源
      最近更新 更多