Я отправляю имя файла (строка), размер файла (int) и файл (байт []).Происходит следующее: в некоторых случаях, в зависимости от того, как быстро обрабатываются данные на стороне сервера, NetworkStream считывает данные, которые мне пока не нужны.
Пример: я делаю .Read, чтобы получить имя файла, я получу данные для имени файла, размера файла и файлов необработанных данных.Я предполагаю, что это происходит потому, что сервер просто выполняет .Write и записывает данные в поток, когда первый .Read еще не выполнен.Это заканчивает тем, что ударило мой размер файла .Читайте.Теперь, когда я делаю .Read для моего размера файла, я показываю ОГРОМНОЕ число, и когда я иду для чтения самого файла и выделяю новый байт [] на основе размера прочитанных файлов, я получаю исключение OutOfMemory.
Как правильно синхронизировать чтение?Примеры, которые я нахожу в сети, делают это так, как я.
Какой-то код:
private void ReadandSaveFileFromServer(TcpClient clientATF, NetworkStream currentStream, string locationToSave)
{
int fileSize = 0;
string fileName = "";
int readPos = 0;
int bytesRead = -1;
fileName = ReadStringFromServer(clientATF, currentStream);
fileSize = ReadIntFromServer(clientATF, currentStream);
byte[] fileSent = new byte[fileSize];
while (bytesRead != 0)
{
if (currentStream.CanRead && clientATF.Connected)
{
bytesRead = currentStream.Read(fileSent, readPos, fileSent.Length);
readPos += bytesRead;
if (readPos == bytesRead)
{
break;
}
}
else
{
WriteToConsole("Log Transfer Failed");
break;
}
}
WriteToConsole("Log Recieved");
File.WriteAllBytes(locationToSave + "\\" + fileName, fileSent);
}
private string ReadStringFromServer(TcpClient clientATF, NetworkStream currentStream)
{
int i = -1;
string builtString = "";
byte[] stringFromClient = new byte[256];
if (clientATF.Connected && currentStream.CanRead)
{
i = currentStream.Read(stringFromClient, 0, stringFromClient.Length);
builtString = System.Text.Encoding.ASCII.GetString(stringFromClient, 0, i);
}
else
{
return "Connection Error";
}
return builtString;
}
private int ReadIntFromServer(TcpClient clientATF, NetworkStream currentStream)
{
int i = -1 ;
int builtInteger = 0;
byte[] integerFromClient = new byte[256];
int offset = 0;
if (clientATF.Connected && currentStream.CanRead)
{
i = currentStream.Read(integerFromClient, offset, integerFromClient.Length);
builtInteger = BitConverter.ToInt32(integerFromClient, 0);
}
else
{
return -1;
}
return builtInteger;
}
Я пробовал использовать смещение ... без всяких проблем.Ваша помощь приветствуется.
Я начал другой вопрос, но он касается чего-то другого.
Заранее спасибо Шон
РЕДАКТИРОВАТЬ: Вот мой код строки отправки:
private void SendToClient( TcpClient clientATF, NetworkStream currentStream, string messageToSend)
{
byte[] messageAsByteArray = new byte[256];
messageAsByteArray = Encoding.ASCII.GetBytes(messageToSend);
if (clientATF.Connected && currentStream.CanWrite)
{
//send the string to the client
currentStream.Write(messageAsByteArray, 0, messageAsByteArray.Length);
}
}