Я недавно начал играть с 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 не самый лучший, поэтому я надеюсь, что мне удалось объяснить это должным образом.