Xamarin形成uwp异步套接字通信示例

时间:2019-06-25 17:36:38

标签: sockets asynchronous xamarin.forms xamarin.uwp

我正在寻找Xamarin Forms异步套接字通信项目的工作示例。我希望项目(服务器和客户端)的两面都是Xamarin Forms应用程序,并能够使用套接字在它们之间进行通信。任何帮助将不胜感激。

PS我无法使用Web套接字,并且我希望服务器为xamarin,以便可以在MacO或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 :(得分:0)

所以我相信我已经弄明白了。本文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应用之间相互通信的机制的详细信息,请参阅应用对应用通信。

但是,据我所知,这句话有点不准确。它似乎不只是在同一台计算机上的两个UWP应用之间。它似乎介于同一台计算机上的任何非控制台应用程序和UWP侦听器之间。

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

我希望这对其他人有帮助,因为这让我感到困惑。

答案 1 :(得分:-1)

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

命名空间:

from flask import Flask, render_template, session, request
from flask_socketio import SocketIO, emit, join_room

app = Flask(__name__)
app.debug = True
app.config['SECRET_KEY'] = 'secretcodehere29403949493'
socketio = SocketIO(app)

@app.route("/template/chat.html/")
def chat():
  return render_template("template/login.html")


@app.route(r'/template/login.html/')
def login():
  return render_template('login.html')


@socketio.on('message', namespace='/chat')
def chat_message(message):
  print("message = ", message)
  emit('message', {'data': message['data']}, broadcast=True)


@socketio.on('connect', namespace='/chat')
def test_connect():
  emit('my response', {'data': 'Connected', 'count': 0})

if __name__ == '__main__':
  socketio.run(app)

示例:

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

AndroidManifest.xml所需的权限为:

        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);

基于MSDN的Asynchronous Server Socket示例可以用作剪切/粘贴示例,而无需进行任何更改。