У меня есть некоторый код для отправки файловых данных с использованием TcpClient, но это слишком медленно.
- Отправка выборочных данных размером 10 байт, данные отправляются и принимаются в соответствии с ожиданиями.
Отправка файла с несколькими МБ занимает много времени
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. Уменьшение размера буфера не делает прием быстрее. (Проверено).