C # ReceiveBufferSize показывает неверное значение - PullRequest
0 голосов
/ 19 апреля 2019

client.ReceiveBufferSize не дает правильный размер полученного байта.

Поэтому я попытался использовать client.Client.SendFile("FileName.png") вместо этого и все еще дает тот же результат. Я также проверил, чтобы убедиться, что отправляемое изображение было больше 64 КБ, и оно показало, что оно отправляет более 64 КБ (со стороны клиента).

Код сервера:

TcpListener server = new TcpListener(IPAddress.Any,12345);
TcpClient client = server.AcceptTcpClient();
NetworkStream clientstream = client.GetStream();
                byte[] ImageByte = new byte[client.ReceiveBufferSize];
                int ReceiveCount = await clientstream.ReadAsync(ImageByte,0,ImageByte.Length);
                File.WriteAllBytes("Screenshot.png",ImageByte);

Код клиента:

TcpClient client = new TcpClient();
client.Connect(IPAddress.Parse("123.456.789.123"), 12345);
                    byte[] imagebyte = File.ReadAllBytes("ImageCaptured.temp");
                    client.GetStream().Write(imagebyte, 0, imagebyte.Length);
                    File.Delete("ImageCaptured.temp");

Предполагается, что client.ReceiveBufferSize показывает около 128 КБ, но точно показывает только до 64 КБ.

1 Ответ

0 голосов
/ 19 апреля 2019

TCP не является системой "byte [] in same byte [] out". Вы можете разделить запись на несколько операций чтения или даже объединить несколько записей в одно чтение.

Что вам нужно сделать, так это внедрить Message Framing в ваш код. Это означает, что вам нужно отправить дополнительные данные, которые ваша принимающая сторона понимает, чтобы знать, сколько данных было отправлено в одном «сообщении».

Вот очень простой пример, когда длина передается перед изображением, тогда другая сторона читает длину, а затем читает это число байтов.

Код клиента

using(TcpClient client = new TcpClient())
{
    client.Connect(IPAddress.Parse("123.456.789.123"), 12345);
    using (var clientStream = client.GetStream()) 
    {
        int imageLength = reader.ReadInt32();
        byte[] imagebyte = new byte[imageLength);
        int readBytes = 0;
        while (readBytes < imageLength)
        {
             int nextReadSize = Math.Min(client.Available, imageLength - readBytes);
             readBytes += await clientStream.ReadAsync(imagebyte, readBytes, nextReadSize);
        }
        File.WriteAllBytes("Screenshot.png",imageByte);
    }
}

Код сервера

TcpListener server = new TcpListener(IPAddress.Any,12345);
using(TcpClient client = await server.AcceptTcpClientAsync()) 
{
    byte[] imagebyte = File.ReadAllBytes("ImageCaptured.temp");
    using(BinaryWriter writer = new BinaryWriter(client.GetStream()))
    {
        writer.Write(imagebyte.Length)
        writer.Write(imagebyte, 0, imagebyte.Length);
    }
    File.Delete("ImageCaptured.temp");
}

Примечание для клиента: если вы не планируете закрывать TcpClient и отправлять больше данных, вам необходимо заменить using(BinaryWriter writer = new BinaryWriter(client.GetStream())) на using(BinaryWriter writer = new BinaryWriter(client.GetStream(), Encoding.UTF8, true))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...