基於之前寫過的基礎,這篇就來寫一下小小的實作結果,以後就可以讓電腦跟手機互相溝通,透過UDP傳輸技術來玩一些應用。
這個實作還是有些限制條件,首先電腦跟手機都必須要在同一個網域裡面(連到同一個WIFI),之後才能透過IP位址來溝通,接下來分別從PC電腦端跟Android Phone手機端來下手。
PC
先來寫電腦端的部分,因為之前就有寫過C#的WPF,這邊就來把它寫得更完整一點,順便讓內容操作更簡單方便一點。
一樣直接先在專案裡面加入以下三個cs檔,namepsace的部分記得改成專案App的名稱RecieveDataEventArgs.cs
UdpSocketHoster.cs
UdpSocketSender.cs
主要的程式碼裡面,有加上一段顯示電腦端的IP位址,因為每次連WIFI,IP的位址可能都會不一樣,所以加上這個顯示,手機端就可以改要傳送的IP了。
附上主程式碼:
MainWindow.xaml.cs
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace UDPSample { public partial class MainWindow : Window { UdpSocketHoster myhoster = new UdpSocketHoster(); UdpSocketSender mysender; String str_ip; public MainWindow() { InitializeComponent(); initSocket(); str_ip = GetIPAddress().ToString(); label_ip.Content = "My IP address: " + str_ip; } // return the first IPv4, non-dynamic/link-local, non-loopback address public static IPAddress GetIPAddress() { IPAddress[] hostAddresses = Dns.GetHostAddresses(""); foreach (IPAddress hostAddress in hostAddresses) { if (hostAddress.AddressFamily == AddressFamily.InterNetwork && !IPAddress.IsLoopback(hostAddress) && // ignore loopback addresses !hostAddress.ToString().StartsWith("169.254.")) // ignore link-local addresses return hostAddress; } return null; // or IPAddress.None if you prefer } public void initSocket() { myhoster = new UdpSocketHoster(); myhoster.RecievedData += (o, e) => RecieveData8008(e.Data.ToString()); myhoster.StartListening += (o, e) => Console.WriteLine("Start Hosting..."); myhoster.StopListening += (o, e) => Console.WriteLine("Stop Hosting..."); myhoster.Start(str_ip, 8008); } public void RecieveData8008(String _data) { Dispatcher.BeginInvoke(new Action(() => { label_recv.Content = "Receive: " + _data; })); } private void button_send_a_Click(object sender, RoutedEventArgs e) { String IPAddress = tbox_ipaddress.Text; String mysocket = tbox_sendsocket.Text; mysender = new UdpSocketSender(IPAddress, 8008); mysender.Send(mysocket); label_send.Content = "Send " + mysocket + " to " + IPAddress; } private void Window_Closed(object sender, EventArgs e) { myhoster.Stop(); } } }
xaml的程式碼:
<Window x:Class="UDPSample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:UDPSample" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525" Closed="Window_Closed"> <Grid> <Viewbox Name="Viewbox1" Stretch="Fill"> <Canvas x:Name="Canvas_main" Height="400" Width="600"> <Label x:Name="label_ip" Content="My IP address" Canvas.Left="100" Canvas.Top="50" FontSize="20"/> <Label x:Name="label_recv" Content="Receive: null" Canvas.Left="100" Canvas.Top="100" FontSize="20"/> <TextBox x:Name="tbox_ipaddress" Canvas.Left="100" TextWrapping="Wrap" Text="172.20.10.5" Canvas.Top="150" FontSize="20" Width="115"/> <TextBox x:Name="tbox_sendsocket" Canvas.Left="250" TextWrapping="Wrap" Text="socket" Canvas.Top="150" FontSize="20" Width="150"/> <Button x:Name="button_send" Content="Send" Canvas.Left="428" Canvas.Top="150" Click="button_send_a_Click" FontSize="20"/> <Label x:Name="label_send" Content="Show send socket" Canvas.Left="100" Canvas.Top="200" FontSize="20"/> </Canvas> </Viewbox> </Grid> </Window>
電腦端的App執行畫面如下:
電腦端這邊也可以輸入手機端的IP位址以及要傳送的字串內容,按下Send之後就會傳送到手機端了。
Android Phone
手機端的部分其實直接用之前寫過的Android(參考這篇)的版本就可以,內容已經很完整了。手機App執行畫面如下:
在手機上一樣可以看到手機本身的IP位址,Receive就是收到來自電腦的字串,而且一樣可以輸入要傳送的電腦IP位址以及字串內容。
這方面的應用很廣,而且實作上很簡單,可以想一些電腦跟手機之間的互動,練習做一些小東西來玩。
沒有留言:
張貼留言