.NET MAUI的Android WiFi图传开发(2)——Android设备利用TCP传输信息
本期我们实现TCP的数据接收和发送。
public interface IWifiService
{
string GetIpAddress();
bool TCP_Send(string message, IPAddress iP, int Port);
}
在上一期的IWifiService类中,我们添加TCP_Send包括App.xaml.cs和MainPage.xaml.cs中,其中参数为message消息,IPAddress IP地址,还有Port端口号。
接着在Android中实现具体Android功能的实现。
public bool TCP_Send(string message,string IP ,int Port)
{
try
{
if (tcpClient == null || !tcpClient.Connected)
{
// 创建并连接到服务器
tcpClient = new TcpClient(IP,Port);
}
// 发送消息
using (NetworkStream stream = tcpClient.GetStream())
{
byte[] buffer = Encoding.UTF8.GetBytes(message);
stream.Write(buffer, 0, buffer.Length);
}
return true;
}
catch (Exception ex)
{
Console.WriteLine($"TCP_Send Exception: {ex.Message}");
return false;
}
}
在功能的实现中,使用网络流来将message发送出去。
接着在MainPage.xaml.cs中调用这个函数。
AndroidWifiService wifiService = new AndroidWifiService();
wifiService.TCP_Send("Hello", IPAddress.Parse("192.168.137.1"), 8081);
向我们的主机地址:192.168.137.1的8081端口发送数据(这里应该要用cmd窗口ipconfig命令来查看主机的IP地址)
接着打开我们的TCP助手,这里用我自己写的TCP助手
可以看到发送数据成功。
接收数据
接收数据比较麻烦,因为我想给他封装成一个类,我们可以异步开启一个监听用来监听收到的消息,当我们收到消息时我们订阅一个事件,利用这个事件向主UI发送已经接收到了消息的指令提醒主函数开始处理接收到的消息。
public event EventHandler MessageReceived;
订阅一个事件。
public async void StartListening(IPAddress IP,int Port)
{
tcpListener = new TcpListener(IP, Port);
tcpListener.Start();
while (true)
{
tcpClient = await tcpListener.AcceptTcpClientAsync();
Task.Run(() => HandleClient(tcpClient));
}
}
private void HandleClient(TcpClient client)
{
try
{
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
string receivedMessage = Encoding.UTF8.GetString(buffer, 0, bytesRead);
// 在主线程上更新UI
Device.InvokeOnMainThreadAsync(() =>
{
// 在UI上显示接收到的消息
OnMessageReceived(receivedMessage);
});
}
}
catch (Exception ex)
{
Console.WriteLine($"Exception in HandleClient: {ex.Message}");
}
}
异步开启监听,接着如果收到了消息,就利用事件将消息传递出去。
public MainPage()
{
InitializeComponent();
#if ANDROID
AndroidWifi.MessageReceived += OnMessageReceived;
AndroidWifi.StartListening(IPAddress.Parse("192.168.137.200"),8099);
#endif
}
初始化函数中,订阅这个事件并且开启特定端口的监听。
并且为订阅的函数进行定义。
private void OnMessageReceived(object sender, string message)
{
// 处理接收到的消息
Label.Text = message;
}
发送端


下面展示主函数的所有代码
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Net;
using System.Net.Sockets;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Controls.PlatformConfiguration;
#if __ANDROID__
using System.Text;
using MAUIapp.Platforms;
using MAUIapp.Platforms.Android.Servers;
#endif
namespace MAUIapp
{
public partial class MainPage : ContentPage
{
#if __ANDROID__
AndroidWifiService AndroidWifi = new AndroidWifiService();
private void OnMessageReceived(object sender, string message)
{
// 处理接收到的消息
Label.Text = message;
// 在这里添加其他处理逻辑
}
#endif
string ReciveBuff;
public MainPage()
{
InitializeComponent();
#if ANDROID
AndroidWifi.MessageReceived += OnMessageReceived;
AndroidWifi.StartListening(IPAddress.Parse("192.168.137.200"),8099);
#endif
}
private void OnButtonClick(object sender, EventArgs e)
{
#if __ANDROID__
try
{
AndroidWifi.TCP_Send("Hello","192.168.137.1",8099);
//Label.Text = "OK";
}
catch (Exception ex)
{
// 捕捉异常并在调试器中查看
Label.Text = ($"Exception: {ex.Message}");
}
#endif
}
}
}


登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!