极客秀
搜索

.NET MAUI的Android WiFi图传开发(2)——Android设备利用TCP传输信息

上期我们介绍了Android设备利用Wifi设备获取Wifi地址。
欢迎大家加入交流群分享经验: ** 656210280 ** 本期我们实现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<string> 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        }    }  
}  
1.转载请保留原文链接谢谢!
2.本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3.本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4.本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5.联系方式(#替换成@):pm#vimge.com

  相关内容