Как заставить сокеты работать в xamarin? - PullRequest
0 голосов
/ 05 июня 2018

В ответе на этот вопрос здесь: Серверное клиентское приложение с .NET и Xamarin ответивший сказал: «На Xamarin.Android вы можете использовать все обычные классы сокетов .Net» Я пыталсяиспользуя код в примере документации Microsoft, и у меня не было ошибок, но приложение просто отображает на телефоне вот так: enter image description here

Если я удалю код сокета, он будет отображатьсястраница обычно. Мой код:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Xamarin.Forms;
    using Xamarin.Forms.Xaml;
    using System.Net;
    using System.Net.Sockets;

    namespace App14
     {
     [XamlCompilation(XamlCompilationOptions.Compile)]
     public partial class Page2 : ContentPage
     {
    public static string data = null;

    public static void StartListening()
    {
        // Data buffer for incoming data.  
        byte[] bytes = new Byte[1024];


        // Establish the local endpoint for the socket.  
        // Dns.GetHostName returns the name of the   
        // host running the application.  
        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

        // Create a TCP/IP socket.  
        Socket listener = new Socket(ipAddress.AddressFamily,
            SocketType.Stream, ProtocolType.Tcp);

        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(10);


            // Start listening for connections.  
            while (true)
            {
                var label = new Label() { Text = "searching for a connection" };
                // Program is suspended while waiting for an incoming connection.  
                Socket handler = listener.Accept();
                label.Text = "Found a Connection";
                data = null;

                // An incoming connection needs to be processed.  
                while (true)
                {
                    int bytesRec = handler.Receive(bytes);
                    data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
                    if (data.IndexOf("<EOF>") > -1)
                    {
                        break;
                    }
                }

                // Show the data on the console.  
                label.Text = "Text received" + data;

                // Echo the data back to the client.  
                byte[] msg = Encoding.ASCII.GetBytes(data);

                handler.Send(msg);
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }


    }

    public Page2 ()
    {
        StartListening();
        Title = "Sign in page";
        InitializeComponent();

    }
   private void page2_click(object sender,EventArgs e)
    {
        Navigation.PushAsync(new Page1(), true);
    }
}
}

Xaml Код файла: enter image description here

Почему это так?. Можете ли вы привести пример клиентамобильная или серверная мобильная розетка

1 Ответ

0 голосов
/ 05 июня 2018
  1. Вы блокируете поток пользовательского интерфейса с помощью вызова StartListening, поскольку он имеет бесконечный цикл while.
  2. Метка, созданная в цикле while, никогда не добавляется в качестве содержимого настраница.Следовательно, текст, который вы добавляете к нему, никогда не будет показан.У вас уже есть ярлык с именем l на странице.В этом случае вы можете просто использовать это, чтобы добавить текст:

    l.Text = "hello";
    
  3. Как прокомментировано, вы должны запустить свой код прослушивания сокета в другом потоке, чтобы не блокировать ваш пользовательский интерфейс.Это может быть таким же простым, как написание Task.Run(() => StartListening());.Убедитесь, что вы понимаете, что это делает, и, возможно, как вы снова отмените этот Task при переходе от страницы или в течение жизненного цикла приложения.

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