本例用WPF程序做服务器端,windows phone程序做客户端。我们使用基于UDP协议的Socket通信。更多关于socket信息请查看:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket(v=vs.110).aspx
我们使用DatagramSocket类完成UDP通信功能。
具体代码如下:(前台代码就不帖出来了,下面只给出后台代码和一些注释。完整源代码会在论坛发出来,地址在文章最后。)
socket通信聊天windows phone 客户端
public sealed partial class MainPage : Page { // DatagramSocket 支持使用 UDP 数据报套接的网络通信 DatagramSocket udpSocket = null; //定义本地端口号 const string LOCAL_PORT = “12200″; public MainPage() { this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Required; } bool isUdpSocketInitializzed = false; //表示是否初始化过 //若要接收 DatagramSocket 对象上的数据,应用程序必须将 MessageReceived 事件分配给事件 //处理程序,然后调用 BindEndpointAsync 或 BindServiceNameAsync 方法将 DatagramSocket //绑定到本地服务名或 UDP 端口上。ConnectAsync 方法还会导致绑定操作。 //写入由一个 GetOutputStreamAsync 方法返回的流也将会导致绑定操作。 //然后 DatagramSocket 可以接收数据报。 protected async override void OnNavigatedTo(NavigationEventArgs e) { if (!isUdpSocketInitializzed) { udpSocket = new DatagramSocket(); //定义在DatagramSocket对象上接受消息的事件 udpSocket.MessageReceived += udpSocket_MessageReceived; //启动DatagramSocket本地服务名的绑定操作 await udpSocket.BindServiceNameAsync(LOCAL_PORT); // 标志初始已完成 isUdpSocketInitializzed = true; } } async void udpSocket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) { //获取DatagramSocket,以获取从DatagramSocket对象上的的远程网络目标接受到的传入数据 var reader = args.GetDataReader(); // 数据长度 uint len = reader.UnconsumedBufferLength; // 读取内容 string message = reader.ReadString(len); // 获取主机的IP地址和端口号 string host = string.Format(“{0}:{1}”, args.RemoteAddress.DisplayName, args.RemotePort); await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { lbMessages.Items.Add(“来自” + host + “的消息:\n” + message); }); } private async void btnSend_Click(object sender, RoutedEventArgs e) { if (string.IsNullOrWhiteSpace(txtToSend.Text) || string.IsNullOrWhiteSpace(txtRemoteIP.Text) || string.IsNullOrWhiteSpace(txtRemotePort.Text)) { return; } // 获取输出流的引用 HostName remoteHost = new HostName(txtRemoteIP.Text); IOutputStream outStream = await udpSocket.GetOutputStreamAsync(remoteHost, txtRemotePort.Text); // 发送消息 DataWriter writer = new DataWriter(outStream); //设置字符编码 writer.UnicodeEncoding = UnicodeEncoding.Utf8; //将字符串值写入输出流 writer.WriteString(txtToSend.Text); // 提交数据 await writer.StoreAsync(); //释放 writer.DetachStream(); writer.Dispose(); tbMessage.Text = “已发送。”; txtToSend.Text = “”; }
socket通信聊天WPF服务器端:
public partial class MainWindow : Window { UdpClient udpClnt = null; const int LOCAL_PORT = 9899;//本地端口 CancellationTokenSource cancelSrc = null; public MainWindow() { InitializeComponent(); this.Closing += (a, b) => { if (udpClnt != null) { try { udpClnt.Close(); } catch (SocketException sex) { System.Diagnostics.Debug.WriteLine(sex.Message); } } }; } private async void DoReceiveMsg() { while (!cancelSrc.IsCancellationRequested) { try { var result = await udpClnt.ReceiveAsync(); // 远程主面信息 string host = string.Format(“{0}:{1}”, result.RemoteEndPoint.Address.ToString(), result.RemoteEndPoint.Port); // 读取消息 string msg = Encoding.UTF8.GetString(result.Buffer); // 显示接到的信息 await Dispatcher.BeginInvoke(new Action( () => { this.lbMessages.Items.Add(“来自” + host + “的消息:\n” + msg); } )); } catch { continue; } } } private void btnEnableRecv_Click(object sender, RoutedEventArgs e) { CheckUdpClient(); // 开始异步接收消息 cancelSrc = new CancellationTokenSource(); Task runTask = new Task(new Action(DoReceiveMsg), cancelSrc.Token); try { runTask.Start();//启动后台任务 tbMessage.Text = “后台接收已开启。”; btnEnableRecv.IsEnabled = false; btnDisableRecv.IsEnabled = true; } catch (TaskCanceledException) { tbMessage.Text = “后台接收任务已取消。”; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } } /// <summary> /// 检测UdpClient对象是否已创建 /// </summary> private void CheckUdpClient() { if (udpClnt == null) udpClnt = new UdpClient(LOCAL_PORT); } private void btnDisableRecv_Click(object sender, RoutedEventArgs e) { // 取消后台任务 if (cancelSrc != null) { cancelSrc.Cancel(); btnEnableRecv.IsEnabled = true; btnDisableRecv.IsEnabled = false; tbMessage.Text = “已取消后台接收消息。”; } } private async void btnSend_Click(object sender, RoutedEventArgs e) { if (string.IsNullOrWhiteSpace(txtToSend.Text)) { return; } CheckUdpClient(); // 验证是否设置远程地址和端口 IPAddress ip; int remotePort; if (!IPAddress.TryParse(txtRemoteIP.Text,out ip)) { MessageBox.Show(“请输入远程IP地址。”); return; } if (!int.TryParse(txtRemotePort.Text, out remotePort)) { MessageBox.Show(“请输入远程端口号。”); return; } // 验证输入的端口号是否合法 if (remotePort < IPEndPoint.MinPort || remotePort > IPEndPoint.MaxPort) { MessageBox.Show(string.Format(“端口号的有效范围在{0}到{1}。”, IPEndPoint.MinPort, IPEndPoint.MaxPort)); return; } // 开始发送消息 byte[] buffer = Encoding.UTF8.GetBytes(txtToSend.Text); // 创建远程终结点 IPEndPoint remote = new IPEndPoint(ip, remotePort); object contentTemp = btnSend.Content; try { btnSend.Content = “正在发送”; btnSend.IsEnabled = false; await udpClnt.SendAsync(buffer, buffer.Length, remote); txtToSend.Clear(); tbMessage.Text = “已发送。”; } catch (Exception ex) { tbMessage.Text = “消息发送失败。”; System.Diagnostics.Debug.WriteLine(ex.Message); } finally { // 发送完毕 btnSend.Content = contentTemp; btnSend.IsEnabled = true; } }
小梦 windows phone 8.1开发:socket通信聊天源代码下载:点我下载哦