Я разрабатываю программу клиент-сервер для передачи файлов по протоколу TCP.В настоящее время я могу отправлять текстовые файлы и другие форматы файлов совершенно нормально, например .zip, со всем содержимым на стороне сервера.Однако, когда я передаю .gif, конечный результат - это gif с тем же размером, что и оригинал, но только с частью изображения, показывающей, как будто большинство байтов потеряно или неправильно записано на стороне сервера.
Клиент отправляет серверу пакет заголовка размером 1 КБ с именем и размером файла.Затем сервер отвечает OK, если готов, а затем создает файловый буфер размером с файл, который нужно отправить.
Вот код, демонстрирующий мою проблему:
// Serverside method snippet dealing with data being sent
while (true)
{
// Spin the data in
if (streams[0].DataAvailable)
{
streams[0].Read(fileBuffer, 0, fileBuffer.Length);
break;
}
}
// Finished receiving file, write from buffer to created file
FileStream fs = File.Open(LOCAL_FOLDER + fileName, FileMode.CreateNew, FileAccess.Write);
fs.Write(fileBuffer, 0, fileBuffer.Length);
fs.Close();
Print("File successfully received.");
// Clientside method snippet dealing with a file send
while(true)
{
con.Read(ackBuffer, 0, ackBuffer.Length);
// Wait for OK response to start sending
if (Encoding.ASCII.GetString(ackBuffer) == "OK")
{
// Convert file to bytes
FileStream fs = new FileStream(inPath, FileMode.Open, FileAccess.Read);
fileBuffer = new byte[fs.Length];
fs.Read(fileBuffer, 0, (int)fs.Length);
fs.Close();
con.Write(fileBuffer, 0, fileBuffer.Length);
con.Flush();
break;
}
}
Я попробовал бинарную запись вместо того, чтобы просто использовать файловый поток с тем же результатом.
Я ошибочно считаю, что успешная передача файла так же проста, как преобразование в байты, транспортировка, а затем преобразование обратно в имя файла / тип?
Вся помощь / совет высоко ценится.