DYCOM之Windows Phone 7.1网络通信

在接到wp7 mango sdk的通知后马上着开发DYCOM For wp mango。毕竟这也已经是等了很久的事情。一直wp7 sdk就没有开放socket通信接口(包括s60的silverlight)。

经过两分钟的工作。顺利把DYCOM for silverlight 4 成功移值到wp7.1。这充份表明了silverlihgt for wp7.1和silverlight 4有着很完美的一致性。起来来说网络通信方面是。致于能不能够支持wcf.net.tcp找个时间再测试下。

在接入正题前先和大家介绍一个DYCOM这个产品。也算是一个小广告。不过不是营利目的的广告。DYCOM是一个跨平台的网络通信套件。它目前支持的客户端已经有.net,wm5/6,wp7.1,android,flash,java和xna。重点是DYCOM决定走共享软件的策略,DYCOM本身须然不开源,不过它提供了免费使用的使用政策。你可以通过使用DYCOM快速开发自己的跨平台通信应用程序。如果你不想付费即可以到http://dy2com.com申请免费授权。它是终身免费的授权。而收费授权和免费授权是一样的。换言之是否付费给DYCOM开发团队是出于你个人自愿的原则。

接下来我会为大家演练如何通过DYCOM快速开发一个wp7.1的即时聊天应用程序。本程序分为两个终端程序。服务器端和客户端程序.

未命名

a)服务器端我们通过c#开始服务器端业务逻辑并以一个控制台程式提供服务给客户端连接和广播消息到所有客户端。

b)客户端是一个wp7.1应用程序。它是一个客户端程序可以连接到服务器

c)要现实的功能是:

1.由任意一个连接到服务器端的wp7手机发送一条消息到服务器端。

2.服务器端收到这条消息后广播到所有已经连接到服务器的所有客户端。

通过以上两个功能需求我们可以完成一个简单的即时文字聊天程序。

以下是正常手动操作的演练过程:

1.登陆DYCOM官方网站申请免费授权,地址:http://bbs.dy2com.com/forum.php?mod=viewthread&tid=18&extra=

申请一个论坛账号登陆后即可以通上以上地址连接浏览到申请DYCOM免费授权KEY的申请框:

未命名

填写好你的用户名和邮箱后点击“申请密钥”按钮后DYCOM会发送一封包含DYCOM密钥的邮件到你的邮箱。通过这个密钥你就可以永久免费的使用DYCOM了。

2.下载DYCOM服务器和wp7客户端示例工程文件:

a)DYCOM服务器示例工程文件:http://www.dy2com.com/a/DYcomxiazai/fuwuqiduanshili/2011/0120/59.html

未命名

以上是五个DYCOM示例,我们只需要下载“dycom 服务器端.net4.0示例”即可。

b)DYCOM客户端下载:http://www.dy2com.com/a/DYcomxiazai/kehuduanshili/2011/0121/66.html

客户端我们只下载wp7即可:

image

要下载的东西到此已经完成.接下来开始调试运行这两个示例并让它们可以相互通信:

小提示:如果你还没有安装wp7.1 sdk 请点击下载并安装:Windows phone 7.1 SDK 下载地址:Direct Download Link

a)解压两个已下载文件后我们得到两个vs2010的项目工程文件。那些我们分别用两个vs2010程序打开这两个工程项目文件。

b)开始运行服务端:调试运行打开了DYComServerVS10Sample工程的vs2010.运行后情况如下:

未命名

c)开始运行客户端:调试运行打开了DYComWPTestClient工程的vs2010.运行后情况如下:

小提示:如果这运行其间出现任何vs的错误提示我们可以先“重新编译”一下整个客户端工程.

未命名

^^运行成功后调试运行即完成。我们试着点击输入框输入一些文字然后发送。正常情况下我们会收到我们自己发送的文本。而且你多几好几个客户端的话同样可以收到某一个客户端发的消息。至此。我们的调试运行已经成功了。接下来就是看看工程的源代码了。

未命名

3.让程序成为正式版呢:还记得我们刚刚申请的DYCOM产品密钥吧。现在我们打开服务端工程文件DYComServerVS10Sample的DYComServer.cs文件。

修改代码:string key = "PD Key";//产品密钥,请修改为您自己的产品密钥

把以上这个key变量的内容改为你的DYCOM产品密钥,

例如:string key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";//产品密钥,请修改为您自己的产品密钥

这样整个应用就已经成为正式的应用了,你可以部署到正式的服务器上。而客户端是不需要输入DYCOM产品密钥的。

通过以上的演练我们已经拥有了一个wp7的高速网络通信源代码工程了。接下来我们尝试自己亲手去为这个应用添加自己需要的功能了。通过接下来的演练你将能够懂得怎样利用DYCOM开发你自己的网络通信应用。而这一切将会是无比的简单。而且通信效率是相当高的。你还可以用DYCOM开发wp7的网络游戏喔。^^

4.添加用户连接通知,需求:当某个新的客户端连接到服务器后,服务器端发送一条通知给已经连接到服务器端的其他客户端。

a)服务器端代码编写:我们只需要修改服务器端的DYComServer.cs即可,

在DYComServer.cs的文件内容开头我们可以看到这样一句代码:

List<myClient> clients = new List<myClient>();

其实它就是所有已经连接到服务器端的客户端集合。那么我们就可以着针对这个集合的调来实现我们的功能了。首先我们找到

//自定义消息操作符
public enum op
{
    login
}

这个enum定义。我们加上一个操作符。你可以随意起个名字,还可以是中文的。修改后如下:

//自定义消息操作符
public enum op
{
    login,
    有新用户连接进入
}

然后我再在服务端的客户OnConnetEvent里添加我们的功能逻辑:

//用户连接事件
void server_OnConnetEvent(DYSocket e, bool IsConneted)
{
    //客户端连接提示
    Console.WriteLine(e.SocketArgs.AcceptSocket.RemoteEndPoint.ToString() + " 已接入");
    //判断连接客户端是否新接入(新接入用户UserToken是等于null的)
    if (e.SocketArgs.UserToken == null)
    {
        //实例化
        var mc = new myClient();
        //把连接客户端设置到客户端实例
        mc.Sock = e;
        //希望用户在一定时间内没有任何通信将其断开(秒)
        //mc.SetupTimeoutCheck(server, 5);
        //操作完成,保存客户实例
        e.SocketArgs.UserToken = mc;

        //发送一个消息给所有已连接到本服务的客户端
        //操作符是 op.有新用户连接进入
        //消息内容是:"服务器通知你,有新的用户连接进入了系统"
        //并使用UTF8编码
        server.SendToAll(clients, DYWriter.Merge(DYWriter.GetDYBytes((int)op.有新用户连接进入),
            DYWriter.GetDYBytes("服务器通知你,有新的用户连接进入了系统",Encoding.UTF8)));

        //添加新客户端到客户端集合
        clients.Add(e.SocketArgs.UserToken as myClient);
    }
}

添加完以上的一句代码后。

5.我们的服务器端修改已经完成.接下来我们着手让客户端接收到消息后显示到用户界面:

a)首先复制DYComServer.cs文件里的eumu op到客户端并代替客户端原有的eumu op。换言之我们把客户端工程DYComWPTestClient中的MainPage.xaml.cs中的enum op改为:

//自定义消息操作符
public enum op
{
    login,
    有新用户连接进入
}

b)在再修改客户端的Ondata事件,因为所有服务器发送的消息都会触发这个事件。我们只要解释消息内容即可:

void ondata(byte[] data)
{
    DYReader read = new DYReader(data);
    int type;
    if (!read.ReadInt32(out type))
    {
        return;
    }
    op opera = (op)type;

    if (opera == op.login)
    {
        string date;
        if (read.ReadString(out date, System.Text.Encoding.UTF8))
        {
            //listBox1.Items.Insert(0, DateTime.Now.Subtract(date).TotalMilliseconds.ToString());
            lb_msgShow.Items.Insert(0, date);
        }
    }
    //判断是否新用户连入操作符,由服务器发送来的
    else if (opera == op.有新用户连接进入)
    {
        string str_服务端消息内容;
        //把消息内容读出到 str_服务端消息内容 变量
        if (read.ReadString(out str_服务端消息内容, System.Text.Encoding.UTF8))
        {
            //在界面中的ListBox中显示消息内容
            lb_msgShow.Items.Insert(0, str_服务端消息内容);
        }
    }
}

至此我们的客户端读取和显示功能也完成了。以下是最终运行后的结果截图,由于wp7模拟器多开很困难。所以我用另一个普通的silverlihgt客户端连接到服务器端:

未命名

结束语:经过这些演练后相信你已经对DYCOM有了比较概念的理解了。希望它能为你创造更多惊喜和价值。

本演练的源工程文件下载:http://dl.dbank.com/c0wllqu9w7

作者:黎东海

网名:内Cool超人

原文地址:https://www.cnblogs.com/jacle169/p/2057547.html