У меня возникли проблемы с отправкой файла 140KB изображения folowing по сети с помощью сокетов:Отправка изображения по сети с помощью сокетов, испортили данные
Начало файла получает переданы правильно, то остальные испортится приводит к следующему результату:
у меня есть сервер, который ожидает файлов и клиент, который подключается к серверу и запускает файл Tranfer. Когда клиент закрывает соединение, сервер знает, что файл был отправлен и сохраняет его.
Все данные на стороне сервера собираются в списке байт (GLOBAL.FILE_BUFFER), перед записываются в файл:
public void OnDataReceived(IAsyncResult asyn)
{
try
{
SocketPacket socketData = (SocketPacket)asyn.AsyncState;
int iRx = socketData.m_currentSocket.EndReceive(asyn);
for (int f = 0; f < iRx; f++)
{
GLOBAL.FILE_BUFFER.Add(socketData.dataBuffer[f]); // Collect all the incoming data into a buffer
}
WaitForData(socketData.m_currentSocket, socketData.socket_id, REQUEST_INDEX_ID);
}
catch (ObjectDisposedException)
{
}
catch (SocketException se)
{
}
}
Это код, я использую для записи в файл:
public static void ByteArrayToFile(string _FileName, byte[] _ByteArray, int BytesRead)
{
System.IO.FileStream _FileStream = new System.IO.FileStream(_FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
_FileStream.Write(_ByteArray, 0, BytesRead);
_FileStream.Close();
}
Я использовал ту же самую функцию ByteArrayToFile на стороне фективного и сохранил изображение правильно. Похоже, что клиент отправляет правильные данные, но когда сервер их получает, он становится испорченным. Я сохранил файл на обоих концах, клиентом и сервером, а затем сравнили их:
Обратите внимание на фиолетовая линия/бар в центре нижней. Это указывает на то, что данные не совпадают с ними, но заметьте, что он идеально подходит в начале.
Я не понимаю, как это может произойти, так как я использую список и просто добавляю в список байтов, пока не появится ничего не осталось читать !? Если у вас нет решения, можете ли вы дать мне какие-нибудь советы? Эта проблема прослушивала меня в течение нескольких недель, хотелось бы, чтобы она поняла окончательно. Благодаря!
Вы проверили данные в байте [], который вы отправляете, совпадают с байтом [], сгенерированным изображением? Отправьте код, который генерирует байт [] –
@Ramhound Извините, я не уверен, что вы имеете в виду. Клиент извлекает изображение из Интернета, а затем загружает его на сервер. Когда я собираю все данные в списке байтов на стороне клиента из httpwebresponse, я сохраняю изображение, чтобы убедиться, что оно действительно, и оно сохраняется и работает. Пожалуйста, дайте мне знать, если это ваш вопрос. Благодаря! – user1192403