Xamarin Forms uwp 异步套接字通信示例

Xamarin Forms uwp Asyncronous Socket Communitation example

我正在寻找 Xamarin Forms 异步套接字通信项目的工作示例。我希望项目的两端(服务器和客户端)都是 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());
        }
    }

我知道移动应用程序部分是正确的,因为它可以连接到监听端口的控制台应用程序。知道为什么这段代码不起作用吗?

在 Xamarin.Forms 上,您可以使用所有常规 .Net 套接字 class:

命名空间:

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-based Asynchronous Server Socket 示例作为 cut/paste 示例,没有任何变化。

所以我相信我明白了。这篇文章 https://docs.microsoft.com/en-us/windows/uwp/networking/sockets#build-a-basic-tcp-socket-client-and-server 指出

由于网络隔离,Windows 不允许在同一台机器上的两个 UWP 应用程序 运行 之间建立套接字连接(套接字或 WinSock);无论是通过本地环回地址 (127.0.0.0),还是通过显式指定本地 IP 地址。有关 UWP 应用可以相互通信的机制的详细信息,请参阅 App-to-app 通信。

但是,据我所知,这种说法有点不准确。它似乎不仅仅存在于同一台计算机上的两个 UWP 应用程序之间。它似乎介于同一台计算机上任何基于 non-console 的应用程序和 UWP 侦听器之间。

因此,当我 运行 从 Android 模拟器尝试连接到我的 UWP 侦听器时,我的 Xamarin 项目测试时,我无法连接,因为这两个应用程序在技术上都是 运行在同一台计算机上。为了验证,我将我的 Android 应用程序部署到设备并重新测试连接到 UWP 应用程序并且连接正常。

我希望这对其他人有所帮助,因为它让我有些困惑。