您的位置:首页 > 其它

第一次使用dycom组件心得体会

2011-01-11 20:43 786 查看
今天开始深入研究dycom组建,因本人愚笨,第一次研究还是很辛苦的,多亏超人耐心指导,总算有所成果,在此一并感谢,现将研究新得体会跟大家分享,不接受拍砖,嘿嘿。。。

俗话说万事开头难,一旦开了头,也就柳暗花明又一村(希望是这样,哈哈)。首先,做好准备工作,也就是把服务端建起来,具体操作见:http://dy2com.com/a/xuexiziyuan/shipinziliao/2011/0112/40.html;这里就不再熬述;然后就是正常的selverlight项目建设,建好后的目录如下(仅作参考,如有不合理的地方还请多多指教,关键是看关于dycom的内容):



项目模型初步完成,先挂起两个服务,哈哈。

运行,正常,



然后是客户端,我做了一个登录:



登录成功



接下来重要的是代码该怎么加,先贴代码:

private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
this.label1.Content = "准备登录!";
listBox1.Items.Clear();
//实例化DYCom客户端实例,服务端地址,端口号,缓冲区大小
poxy = new ClientPoxy("127.0.0.1", 4510, 1024);
//连接事件注册处理函数
poxy.onConnet = new OnConnet(onConnect);
//消息到来事件注册处理函数
poxy.onData = new OnData(onData);
//断开连接事件注册处理函数
poxy.onDisconnet = new OnDisConnet(ondisConnect);

//发送message到服务端
//这里消息体本身是操作符+message,使用UTF8编码,读取的时候也一样要按这个消息体顺序进行读取消息
//DYWriter.Merge是合并DYWriter.GetDYBytes消息之用

JsonMapper mapper = new JsonMapper();
Model.User u = new Model.User();
u.Name = this.Uname.Text.Trim();
u.Pwd = this.Upwd.Text.Trim();
string jsondata = mapper.ToJson(u);
poxy.Send(DYWriter.Merge(DYWriter.GetDYBytes((int)op.login), DYWriter.GetDYBytes(jsondata, System.Text.Encoding.UTF8)));
}


修改了这句:

poxy.Send(DYWriter.Merge(DYWriter.GetDYBytes((int)op.login), DYWriter.GetDYBytes(jsondata, System.Text.Encoding.UTF8)));


这几句代码的意思在手册里可以找到,我再磨叽一遍,主要是下边这句

将实体做json序列化,然后下边那句发送到服务器端。

string jsondata = mapper.ToJson(u);


(注:客户端所用到类及方法与服务器端用到的代码是一样的,所以超人的速查手册通用于客户端与服务器端,地址:http://dy2com.com/a/xuexiziyuan/wendangziliao/2011/0114/46.html

[align=left]服务器端代码该如何写,先贴代码:[/align]

//用户消息收到事件
void server_OnDataEvent(byte[] data, UserInfo user)
{
//实例化DYCOM消息解码器
DYReader read = new DYReader(data);
//操作符变量
int type;
//读取消息中的操作符
if (!read.ReadInt32(out type))
{
//操作符不存即断开当前客户端连接
server.DisConnet(user.Sock);
//跳出本函数
return;
}
//转换操作符
op opera = (op)type;
//判断操作符
if (opera == op.login)
{
//变量
string message;
//读出一个字符串值到message变量,使用UTF8解码
if (read.ReadString(out message, Encoding.UTF8))
{
ChatRoom.Model.User u = new ChatRoom.Model.User();
JsonMapper mapper = new JsonMapper();
var myclassdata = mapper.ToObject<ChatRoom.Model.User>(message);
u = (ChatRoom.Model.User)myclassdata;
string str = u.Name + u.Pwd;
//clientHanddle.joinZoned(myclassdata);

//发送message到所有指定客户端售
//这里消息体本身是操作符+message,读取的时候也一样要按这个消息体顺序进行读取消息
//DYWriter.Merge是合并DYWriter.GetDYBytes消息之用
server.SendToAll<myClient>(clients, DYWriter.Merge(DYWriter.GetDYBytes((int)op.login),
DYWriter.GetDYBytes(str, Encoding.UTF8)));
}
}
}


ChatRoom.Model.User u = new ChatRoom.Model.User();
JsonMapper mapper = new JsonMapper();
var myclassdata = mapper.ToObject<ChatRoom.Model.User>(message);
u = (ChatRoom.Model.User)myclassdata;
string str = u.Name + u.Pwd;


做json反序列化,还原原始数据,数据还原后就可以做自己想做的事了,这里无非就是验证数据存在,但还没有加,哈哈,验证的结果就可以回发给客户端,回发的数据结构可以自己定义,也就是在处理下,这也是超人的高明之处(尽量不拍在马腿上,嘿嘿。。。),客户端接收到数据后跟在服务器端操作一样,做json反序列化,还原真实数据,给据结果做相应操作,支次客户端与服务器端的一次交互也就完成了。

无非就是添加了如下代码:

修改了如下代码:

server.SendToAll<myClient>(clients, DYWriter.Merge(DYWriter.GetDYBytes((int)op.login),
DYWriter.GetDYBytes(str, Encoding.UTF8)));


关键代码是下边这句

mapper.ToObject<ChatRoom.Model.User>(message);


(注:如果想在服务器端或客户端还原User实体,需要客户端与服务器端同时定义实体,也就是里边一个,外边一个,不然找不到。)

附超人语录:

1.
超人也是人。

2.
客户端到服务器端只有send一个方法(我认为:目前是这样,后面可能会有更丰富的功能扩展)。

3.
(int)op.login为啥要枚举下,然后强制转换?无非就是可读性。

4.
//数据转json

string jsondata = mapper.tojson<classtype>(data);

//json转数据

var myclassdata= mapper.toobject<classtye>(jsondata);

5.
停电可以用借手机网络上网,只开QQ

文笔有限,不够华丽;
技术有限,不够深度;

附源码:http://files.cnblogs.com/txst/ChatRoom.rar

文章来源:http://bbs.dy2com.com/forum.php?mod=viewthread&tid=58&page=1&extra=#pid97 如转载请保留此链接。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: