本期我们实现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
        }
    }

}


嘉立创PCB

还没有评论,抢个沙发!