Xamarin Forms uwp Пример асинхронной сокетной коммуникации - PullRequest
0 голосов
/ 25 июня 2019

Я ищу рабочий образец проекта связи Xamarin Forms Asynchronous Socket. Я хочу, чтобы ОБА стороны моего проекта (сервер и клиент) были приложениями Xamarin Forms и чтобы они могли общаться между собой с помощью сокетов. Любая помощь будет принята с благодарностью.

PS Я не могу использовать веб-сокеты и хочу, чтобы сервер был xamarin, чтобы я мог использовать его на MacOs или в приложении Windows UWP

ОБНОВЛЕНИЕ - у меня есть примеры рабочих звонков из приложения Xamarin Forms для мобильных устройств в слушатель консольного приложения. Однако, когда я пытаюсь переместить код консольного приложения в другое приложение Xamarin Forms и запустить проект UWP для прослушивания соединений, соединение никогда не получается. Вот код:

Это код кнопки в моем серверном приложении, которая начинает перечислять:

    private void btnStartListening_Clicked(object sender, System.EventArgs e)
    {
        Task.Run(async () =>
        {
            AsynchronousSocketListener.StartListening();
        });

    }

Вот метод сервера, который слушает:

    public static void StartListening()
    {

        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[1];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

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

        // Bind the socket to the local endpoint and listen for incoming connections.  
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(100);

            while (true)
            {
                // Set the event to nonsignaled state.  
                allDone.Reset();

                // Start an asynchronous socket to listen for connections.  
                Debug.WriteLine("Waiting for a connection on " + ipAddress.ToString() + "...");
                listener.BeginAccept(
                    new AsyncCallback(AcceptCallback),
                    listener);

                // Wait until a connection is made before continuing.  
                allDone.WaitOne();
            }

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

Я знаю, что часть мобильного приложения правильная, потому что она может подключаться к консольному приложению, прослушивающему порт. Есть идеи, почему этот код не работает?

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Так что я думаю, что понял это. В этой статье https://docs.microsoft.com/en-us/windows/uwp/networking/sockets#build-a-basic-tcp-socket-client-and-server говорится

Вследствие изоляции сети Windows не позволяет устанавливать сокет-соединение (Sockets или WinSock) между двумя приложениями UWP, работающими на одной машине; будь то через локальный адрес обратной связи (127.0.0.0) или путем явного указания локального IP-адреса. Подробнее о механизмах взаимодействия приложений UWP друг с другом см. В разделе Связь между приложениями.

ОДНАКО, насколько я могу судить, это утверждение немного неточно. Похоже, что это не только между двумя приложениями UWP на одном компьютере. Похоже, что это может быть между любым не консольным приложением и слушателем UWP на одном компьютере.

Таким образом, когда я выполнял свой тест проекта Xamarin из эмулятора Android, пытаясь подключиться к своему прослушивателю UWP, я не мог подключиться, потому что оба приложения технически работали на одном компьютере. Чтобы проверить, я развернул приложение Android на устройстве и повторно подключился к приложению UWP, и оно подключилось нормально.

Надеюсь, это поможет другим, так как меня это немного смутило.

0 голосов
/ 26 июня 2019

В Xamarin.Forms вы можете использовать все обычные классы сокетов .Net:

Namespaces:

using System.Net;
using System.Net.Sockets;

Пример:

        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
        System.Diagnostics.Debug.WriteLine(ipAddress.ToString());
        // Create a TCP/IP socket.
        Socket listener = new Socket(AddressFamily.InterNetwork,
                             SocketType.Stream, ProtocolType.Tcp);

AndroidManifest.xml Требуемые разрешения:

<uses-permission android:name="android.permission.INTERNET" />

Пример для асинхронного серверного сокета на базе MSDN работает как пример вырезания / вставки без изменений.

...