потеря данных при передаче файла с сервера на клиент с использованием потока в c # - PullRequest
0 голосов
/ 16 сентября 2010

сторона сервера

stream.BeginWrite(clientData, 0, clientData.Length, 
       new AsyncCallback(CompleteWrite), stream);

сторона клиента

int tot = s.Read(clientData, 0, clientData.Length);

Я использовал классы TCPClient, TCPlistener

clientData - это байтовый массив. Размер ClientData равен 2682 на стороне сервера. Я использовал класс NetworkStream для записи данных

, но на стороне клиента полученные данные содержат только 1642 байта. Я использовал потоковый класс для чтения данных в клиентесторона

Что не так?

Ответы [ 2 ]

4 голосов
/ 16 сентября 2010

Методу чтения разрешено возвращать меньше байтов, чем вы запрашивали.Вам нужно повторно вызывать Read, пока вы не получите желаемое количество байтов.

0 голосов
/ 16 сентября 2010

Используйте этот метод для правильного чтения из потока:

public static void ReadWholeArray (Stream stream, byte[] data)
{
int offset=0;
int remaining = data.Length;
while (remaining > 0)
{
    int read = stream.Read(data, offset, remaining);
    if (read <= 0)
        throw new EndOfStreamException 
            (String.Format("End of stream reached with {0} bytes left to read", remaining));
    remaining -= read;
    offset += read;
 }
}

Вы можете сначала записать длину файла в поток (скажем, как int), например,

сторона сервера:

server.Write(clientData.Length)
server.Write(clientData);

сторона клиента:

 byte[] size = new byte[4];                
 ReadWholeArray(stream, size);
 int fileSize = BitConverter.ToInt32(size, 0);
 byte[] fileBytes = new byte[fileSize];
 ReadWholeArray(stream, fileBytes);

Подробнее о чтении из потоков см. http://www.yoda.arachsys.com/csharp/readbinary.html.

...