0

サーバ側

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バイトしか含まれていません。クライアント側でデータを読み取るためにストリームクラスを使用しました

どうしたの?

4

2 に答える 2

4

Read メソッドは、要求したよりも少ないバイト数を返すことが許可されています。必要なバイト数を受け取るまで、Read を繰り返し呼び出す必要があります。

于 2010-09-16T11:34:55.763 に答える
0

このメソッドを使用して、ストリームから適切に読み取ります。

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を参照してください。

于 2010-09-16T12:12:00.830 に答える