Чтение NetworkStream () слишком медленно, занимает ~ 9 минут для 7,5 МБ - PullRequest
0 голосов
/ 19 мая 2019

У меня есть некоторый код для отправки файловых данных с использованием TcpClient, но это слишком медленно.

  1. Отправка выборочных данных размером 10 байт, данные отправляются и принимаются в соответствии с ожиданиями.
  2. Отправка файла с несколькими МБ занимает много времени

    public static void SendBytes(TcpClient clientSocket, byte[] outStream)
    {
        Debug.WriteLine("SendBytes() number of bytes: " + outStream.Length.ToString());
    
        byte[] encoded_outStream = EncoderDecoder.Encoder(outStream);
    
        NetworkStream serverStream = clientSocket.GetStream();
    
        byte[] rv = new byte[encoded_outStream.Length + ProgramState.end_networkdata_bytes.Length];
    
        System.Buffer.BlockCopy(encoded_outStream, 0, rv, 0, encoded_outStream.Length);
        System.Buffer.BlockCopy(ProgramState.end_networkdata_bytes, 0, rv, encoded_outStream.Length, ProgramState.end_networkdata_bytes.Length);
    
        serverStream.Write(rv, 0, rv.Length);
        serverStream.Flush();
    }
    
    private static int MAX_SIZE = 500000000;
    public static byte[] ReceiveBytes(TcpClient clientSocket)
    {
        Debug.WriteLine("[" + DateTime.Now.ToString("G") + "] - " + "ReceiveBytes() started.");
        clientSocket.NoDelay = true;
        NetworkStream networkStream = clientSocket.GetStream();
    
        byte[] bytesFrom = new byte[MAX_SIZE];
        clientSocket.ReceiveBufferSize = MAX_SIZE;
    
        networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
    
        int index = GetFirstOccurance(ProgramState.end_networkdata_bytes[0], bytesFrom);
        Debug.WriteLine("ReceiveBytes(), SubArray index: " + index.ToString());
    
        byte[] tmp_res = bytesFrom.SubArray(0, index);
        byte[] res = EncoderDecoder.Decoder(tmp_res);
    
        Debug.WriteLine("ReceiveBytes() number of bytes: " + res.Length.ToString());
        return res;
    }
    

РЕДАКТИРОВАТЬ: код для получения данных в несколько кусков

    private static int MAX_SIZE = 10000;
    public static byte[] ReceiveBytes(TcpClient clientSocket)
    {
        Debug.WriteLine("[" + DateTime.Now.ToString("G") + "] - " + "ReceiveBytes() started.");
        clientSocket.NoDelay = true;

        NetworkStream networkStream = clientSocket.GetStream();

        clientSocket.ReceiveBufferSize = MAX_SIZE;

        byte[] tmp_bytesFrom = new byte[MAX_SIZE];


        while(GetFirstOccurance(ProgramState.end_networkdata_bytes[0], tmp_bytesFrom) < 0)
        {
            networkStream.Read(tmp_bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
        }

        Debug.WriteLine("[" + DateTime.Now.ToString("G") + "] - " + "ReceiveBytes(), received number of raw bytes: " + tmp_bytesFrom.Length.ToString());
        return tmp_bytesFrom;
    }

При отправке файла с несколькими МБ (7,5 МБ) функция ReceiveBytes () занимает: ~ 9 минут. Замечания: 1. Функции Encoder () и Decoder () не влияют на мою скорость. 2. Уменьшение размера буфера не делает прием быстрее. (Проверено).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...