zoukankan      html  css  js  c++  java
  • windows phone 8.1开发:socket通信聊天

    本例用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 + “的消息:
    ” + 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 + “的消息:
    ” + 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通信聊天源代码下载:点我下载哦

  • 相关阅读:
    《ERP—从内部集成起步》目录
    你与开发高手的距离(转)
    《ERP从内部集成起步》读书笔记——第2章 从优化业务流程谈信息集成的必要性 2.2信息集成与实时共享 2.2.1信息孤岛割断了流程
    《ERP从内部集成起步》读书笔记——第2章 从优化业务流程谈信息集成的必要性 2.2信息集成与实时共享2.2.3信息集成的条件
    浴室里没有人水是我开的
    你的爱不离不弃
    找到你的幸福
    谁有选择谁就有痛苦
    “生态建筑”如何“生态”
    Kindness keep the world afloat
  • 原文地址:https://www.cnblogs.com/xdoudou/p/3945272.html
Copyright © 2011-2022 走看看