Communication(通訊)之基於 Socket UDP 開發一個多人聊天室
介紹
與眾不同 windows phone 7.5 (sdk 7.1) 之通訊
執行個體 - 基於 Socket UDP 開發一個多人聊天室
樣本
1、服務端
Main.cs
/* * Socket UDP 聊天室的服務端 * * 註:udp 報文(Datagram)的最大長度為 65535(包括報文頭) */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading; using System.IO; namespace SocketServerUdp { public partial class Main : Form { SynchronizationContext _syncContext; System.Timers.Timer _timer; // 用戶端終結點集合 private List<IPEndPoint> _clientList = new List<IPEndPoint>(); public Main() { InitializeComponent(); // UI 線程 _syncContext = SynchronizationContext.Current; // 啟動後台線程接收資料 Thread thread = new Thread(new ThreadStart(ReceiveData)); thread.IsBackground = true; thread.Start(); // 每 10 秒運行一次計時器所指定的方法,群發資訊 _timer = new System.Timers.Timer(); _timer.Interval = 10000d; _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed); _timer.Start(); } // 接收資料 private void ReceiveData() { // 執行個體化一個 UdpClient,監聽指定連接埠,用於接收資訊 UdpClient listener = new UdpClient(3367); // 用戶端終結點 IPEndPoint clientEndPoint = null; try { while (true) { // 一直等待,直至接收到資料為止(可以獲得接收到的資料和用戶端終結點) byte[] bytes = listener.Receive(ref clientEndPoint); string strResult = Encoding.UTF8.GetString(bytes); OutputMessage(strResult); // 將發送此資訊的用戶端加入用戶端終結點集合 if (!_clientList.Any(p => p.Equals(clientEndPoint))) _clientList.Add(clientEndPoint); } } catch (Exception ex) { OutputMessage(ex.ToString()); } } private void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { // 每 10 秒群發一次資訊 SendData(string.Format("webabcd 對所有人說:大家好! 【資訊來自服務端 {0}】", DateTime.Now.ToString("hh:mm:ss"))); } // 發送資料 private void SendData(string data) { // 向每一個曾經向服務端發送過資訊的用戶端發送資訊 foreach (IPEndPoint ep in _clientList) { // 執行個體化一個 UdpClient,用於發送資訊 UdpClient udpClient = new UdpClient(); try { byte[] byteData = UTF8Encoding.UTF8.GetBytes(data); // 發送資訊到指定的用戶端終結點,並返回傳送的位元組數 int count = udpClient.Send(byteData, byteData.Length, ep); } catch (Exception ex) { OutputMessage(ex.ToString()); } // 關閉 UdpClient // udpClient.Close(); } } // 在 UI 上輸出指定資訊 private void OutputMessage(string data) { _syncContext.Post((p) => { txtMsg.Text += p.ToString() + "\r\n"; }, data); } } }