private async void receiveingUDPPacket() { while (true) { var result = await udpClient.ReceiveAsync(); string receiveStr = Encoding.UTF8.GetString(result.Buffer); if (result.RemoteEndPoint.Port == 37654) { if (receiveStr.Contains("ID: ") && receiveStr.Contains(", Name: ")) { string IDstr = receiveStr.Split(',')[0].Substring(4); string Namestr = receiveStr.Split(',')[1].Substring(7); if (IDstr != id.ToString()) { Dispatcher.BeginInvokeOnMainThread(() => { EPButton btn = null; foreach (var v in EPButtons.Children) { EPButton b = v as EPButton; if (b.PeerID == ulong.Parse(IDstr)) { btn = b; } } if (btn == null) { btn = new EPButton(); btn.PeerID = ulong.Parse(IDstr); EPButtons.Children.Add(btn); btn.Clicked += BTNPeer_Clicked; } btn.Text = Namestr; btn.PeerIP = result.RemoteEndPoint.Address; btn.Timeout = ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds() + 10; }); } } } } }
protected void BTNPeer_Clicked(object sender, EventArgs args) { TcpClient tcpClient = new TcpClient(); EPButton btn = sender as EPButton; try { tcpClient.Connect(btn.PeerIP, 37654); int trying = 0; do { string telegram = string.Format("ID: {0}, Name: {1}, To: {2}", id.ToString(), (EntryPlayerName.Text != "") ? EntryPlayerName.Text : defaultName, btn.PeerID.ToString()); tcpClient.GetStream().Write(Encoding.UTF8.GetBytes(telegram), 0, Encoding.UTF8.GetByteCount(telegram)); byte[] buffer = new byte[2048]; tcpClient.GetStream().Read(buffer, 0, buffer.Length); string response = Encoding.UTF8.GetString(buffer); response = response.Trim('\0'); if (response.Contains("OK.., Name: ")) { string peerName = response.Split(',')[1].Substring(7); Dispatcher.BeginInvokeOnMainThread(() => { Navigation.PopModalAsync(); Navigation.PushModalAsync(new NetworkPlayPage(tcpClient, id ^ btn.PeerID, peerName, false)); }); break; } else { trying++; } } while (trying < 5); } catch { EPButtons.Children.Remove(btn); } }
private void backgroundFunc() { while (!cancelingBackground) { System.Threading.Thread.Sleep(200); string newTitle = "配對"; for (int i = 0; i < titleLabelDotAnimation; i++) { newTitle += "."; } titleLabelDotAnimation++; titleLabelDotAnimation %= 7; Dispatcher.BeginInvokeOnMainThread(() => { LabelTitle.Text = newTitle; List <EPButton> toRemove = new List <EPButton>(); foreach (var v in EPButtons.Children) { EPButton b = v as EPButton; if (b.Timeout < ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds()) { toRemove.Add(b); } } foreach (var v in toRemove) { v.Clicked -= BTNPeer_Clicked; EPButtons.Children.Remove(v); } }); string telegram = string.Format("ID: {0}, Name: {1}", id.ToString(), (EntryPlayerName.Text != "") ? EntryPlayerName.Text : defaultName); udpClient.SendAsync(Encoding.UTF8.GetBytes(telegram), Encoding.UTF8.GetByteCount(telegram), new IPEndPoint(IPAddress.Broadcast, 37654)); } }