我正在寻找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());
}
}
我知道移动应用程序部分是正确的,因为它可以连接到在端口上监听的控制台应用程序。知道为什么这段代码不起作用吗?
答案 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示例可以用作剪切/粘贴示例,而无需进行任何更改。