上期我们介绍了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 } }
}