从DataReader读取数据时出现OutOfMemoryException

山姆

这是这种情况:我正在建立TCP连接(对我自己)以字符串格式发送一些数据。创建一个连接,发送数据,然后立即关闭连接(我不想同步等待数据)。在发送字符串之前,我将其长度(data.Length附加在字符串的前面,因此我知道接收到该字符串时要读取多少数据。我正在StreamSocketListener侦听来自TCP连接的传入数据,并制作了一些“帮助程序”类,以简化外部环境。该类被实例化一次,并Start调用该方法以开始侦听连接。就是这种情况。当我发送数据(给自己,但这没关系)时,我System.OutOfMemoryException在方法中得到了StreamReadLine

对我来说,为什么发生这种情况不是很明显,所以这就是为什么我在这里。我希望有人以前已经处理过这个问题,并且知道是什么问题。

public delegate void TCPRequestHandler(string data, string sender);
public class TCPSocketListener
{
    private int port;
    private StreamSocketListener listener;
    private bool mIsActive = false;
    private event TCPRequestHandler requestHandlerCallback;

    public bool isActive
    {
        get { return mIsActive; }
    }

    public TCPSocketListener(int port, TCPRequestHandler requestHandlerCallback)
    {
        this.port = port;
        this.requestHandlerCallback = requestHandlerCallback;
    }

    public async void Start()
    {
        if (!mIsActive)
        {
            mIsActive = true;
            listener = new StreamSocketListener();
            listener.Control.QualityOfService = SocketQualityOfService.Normal;
            listener.ConnectionReceived += Listener_ConnectionReceived;
            await listener.BindServiceNameAsync(port.ToString());
        }
    }

    public void Stop()
    {
        if (mIsActive)
        {
            listener.Dispose();
            mIsActive = false;
        }
    }

    async void Listener_ConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
    {
        string data = await ExtractRequestData(args.Socket);
        await Task.Run(() => requestHandlerCallback(data, args.Socket.Information.RemoteHostName.CanonicalName));
    }

    private async Task<string> ExtractRequestData(StreamSocket socket)
    {
        //Initialize IO classes
        DataReader reader = new DataReader(socket.InputStream);
        //DataWriter writer = new DataWriter(socket.OutputStream);
        //writer.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;

        // get the data on the stream
        string data = await StreamReadLine(reader);

        socket.Dispose();
        return data;
    }

    private static async Task<string> StreamReadLine(DataReader reader)
    {
        System.Diagnostics.Debug.WriteLine("reading data");
        var stringHeader = await reader.LoadAsync(4);

        if (stringHeader == 0)
        {
            System.Diagnostics.Debug.WriteLine("Header of the data was 0, for whatever reason");
            return "null";
        }
        int strLength = reader.ReadInt32();
        uint numStrBytes = await reader.LoadAsync((uint)strLength);
        string data = reader.ReadString(numStrBytes);
        System.Diagnostics.Debug.WriteLine("read " + data);
        return data;
    }
}
山姆

感谢Lasse和Stephen(有问题的评论),因为它们是正确的。实际上,数据长度确实首先是数据的前缀,然后以字节为单位进行复制,而不是首先以字节为单位获取文本,然后以字节为前缀来添加长度。

因此,我要做的是创建一个总长度(有效负载)的新字节数组,然后获取数据字节,然后使用数据长度填充前4个字节。像这样:

转移前:

// Add the length of the data at the start, so we know how much characters to read when receiving this
Int32 dataLength = data.Length;
// Add the data to be sent into the buffer
byte[] payload = new byte[sizeof(Int32) + (dataLength * sizeof(char))];
byte[] dataBytes = System.Text.Encoding.UTF8.GetBytes(data);
System.Buffer.BlockCopy(dataBytes, 0, payload, 4, dataBytes.Length);

payload[0] = (byte)(dataLength >> 24);
payload[1] = (byte)(dataLength >> 16);
payload[2] = (byte)(dataLength >> 8);
payload[3] = (byte)dataLength;

收到时:

var stringHeader = await reader.LoadAsync(4);
Int32 strLength = reader.ReadInt32();
uint numStrBytes = await reader.LoadAsync((uint)strLength);
string data = reader.ReadString(numStrBytes);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

迭代大型数据集时出现OutOfMemoryException

读取字符串时出现OutOfMemoryException

使用Task <int>从MySql读取数据时,DataReader已打开

在 C# windows 窗体中读取大型 XML 文件时出现 OutofMemoryException

服务器从客户端读取消息时,出现OutOfMemoryException

从数据表到数据网格显示数据时出现System.outofmemoryException

尝试下载大文件时出现OutOfMemoryException

写入Excel时出现System.OutOfMemoryException

生成排列时出现System.OutOfMemoryException

DataReader-读取长度未知的数据

从 DBF 数据库读取数据时出现 UnicodeDecodeError

PHP从数据库读取数据时出现问题

使用来自 datareader 的股票数据时出现 Pandas 错误“没有可绘制的数字数据”

读取熊猫数据框时出现pyspark类型错误

使用python从蜂巢读取数据时出现性能问题

读取CANVAS DOM数据时出现问题

尝试使用 Selenium 从 Excel 文件读取数据时出现 NullPointerException

从核心数据读取时出现错误:iOS Swift

读取zlib / miniz压缩数据时出现DATA_ERROR

读取远程数据集(NBM)时出现xarray MissingDimensionsError

读取sqllite数据库时出现问题

从 MySql 数据库读取时出现 Java Preparedstatement 错误

在onSensorChanged上读取数据时出现问题

OutOfMemoryException:尝试迭代数据集时

并行读取AutoCad数据库时出现“尝试读取或写入受保护的内存”错误

使用Facebook隐藏解密文件时出现OutOfMemoryException

在C#中填充List <byte>时出现OutOfMemoryException

保存/创建/导出Excel工作表时出现OutOfMemoryException

对60Gb的文件使用压缩存档时出现“ OutOfMemoryException”