Клиент получает только 1440 байтов потока - PullRequest
0 голосов
/ 14 апреля 2020

Я недавно начал играть с Xamarin спустя долгое время, и я очень рад, что он прошел долгий путь.

Я создаю android приложение с xamarin, и у меня странная проблема.

Мое приложение Xamarin отправляет поток на windows TCPServer (через сокет), содержащий короткую строку.

TCPServer распознает эту строку как определенную команду и создает строку JSON (извлекает некоторые данные из базы данных ), затем отправьте его обратно в приложение Xamarin.

Однако, если поток, содержащий JSON, превышает 1440 байт, он обрезается на 1440 байт. Если JSON меньше 1440, он будет работать нормально.

Затем я создал windows консольное приложение и скопировал вставленный код из клиентского приложения Xamarin, отправил ту же строковую команду в TCPServer и получил JSON 3360 байт назад. Я проверил это с различными строками JSON, и все работает, если оно получено на машине windows независимо от размера (одна из строк была 56514 байтов). Но на Android, в зависимости от устройства, если оно больше 1440 байт, оно получит всего 1440 байт.

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


Эмулятор Xamarin - 1440 байт

Sony Xperia - 1460 байт

Samsung Galaxy A5 - 11680 байт


Интересно, есть ли некоторые ограничения TCPclient при использовании в Xamarin или некоторые параметры, которые мне не хватает?

Код TCPServer

    private void StartLncListener()
    {

        IPAddress myIP = IPAddress.Parse("192.168.1.8");
        TcpListener server = new TcpListener(myIP, 8005);
        TcpClient client = default(TcpClient);

        try
        {

            server.Start();
            SetText("Waiting for connection... ");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        while (true)
        {
            client = server.AcceptTcpClient();
            byte[] receivedBuffer = new byte[5000]; //tried to play with this
            NetworkStream stream = client.GetStream();
            SetText("Client connected...");

            stream.Read(receivedBuffer, 0, receivedBuffer.Length);
            StringBuilder msg = new StringBuilder();

            foreach (byte b in receivedBuffer)
            {
                if (b.Equals(00))
                {
                    break;
                }
                else
                {
                    msg.Append(Convert.ToChar(b).ToString());
                }

            }

            var ReturnedData = DecodeData(msg.ToString());

            int byteCount = Encoding.UTF8.GetByteCount(ReturnedData);
            byte[] responseMsg = System.Text.Encoding.UTF8.GetBytes(ReturnedData);

            stream.Write(responseMsg, 0, responseMsg.Length);
        }

    }

Код TCPClient

public string ConnectLnc(string serverIP, int port, String request)
        {

            TcpClient client = new TcpClient(serverIP, port);

            int byteCount = Encoding.ASCII.GetByteCount(request);
            byte[] sendData = new byte[byteCount];

            sendData = Encoding.ASCII.GetBytes(request);

            NetworkStream stream = client.GetStream();
            stream.Write(sendData, 0, sendData.Length);

            while (true)
            {
                byte[] receivedBuffer = new byte[1000000]; //was 5k, changed to million for test

                stream.Read(receivedBuffer, 0, receivedBuffer.Length);

                string TMPmsg = Encoding.UTF8.GetString(receivedBuffer, 0, receivedBuffer.Length);

                StringBuilder msg = new StringBuilder();
                foreach (byte b in receivedBuffer)
                {
                    if (b.Equals(00))
                    {
                        break;
                    }
                    else
                    {
                        msg.Append(Convert.ToChar(b).ToString());
                    }

                }

                stream.Close();
                client.Close();

                var len = msg.Length;
                byte[] bytes = Encoding.ASCII.GetBytes(msg.ToString());

                return msg.ToString();
            }

        }

My Engli sh не самый лучший, поэтому я надеюсь, что мне удалось объяснить это должным образом.

...