博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Silverlight socket组件
阅读量:6951 次
发布时间:2019-06-27

本文共 2391 字,大约阅读时间需要 7 分钟。

    在Silverlight 一般是采用wcf进行数据通讯,毕竟wcf在数据结构定义上非常方便,但如果你想用Silverlight下的socket进行对象传偷就不得不封装处理一下,在Silverlight下有XML序列化也是非常方便的,但这样会导致消息比较臃肿,同样还要对数据包分析处理包括粘包等工作.如果你要面对这些问题那以下组件也许会给你带来很大的帮助.Beetle.SL是封装Silverlight socket tcp的一个开源组件.

    组件封装方便使用的TcpChannel,通过事件定义就能方便进行tcp连接,数据接收事件定义等.更重要的是组件提供灵活的协议分析器,可以根据分析器直接实现对象和byte[]的转换.除了提供数据对象转换外还提供tcp粘包问题,可以让使用者完全不用关心这些烦锁的事情.

    组件协议分析器的制定也是非常灵活,除了提供基于结束符和头描述大小的分包机制外,使用者还可以根据自己的需要实现自己的封包协议.自带的协议分析所组装的协也是基于基础类型的存格式.所以服务端也可以方便地使用c++,java等平台实现.

    连接定义

mChannel = new TcpChannel(new HeadSizePackage());        mChannel.Connected += OnConnected;        mChannel.Error += OnError;        mChannel.Receive += OnReceive;        mChannel.Connect(txtIPAddress.Text, 4505);        private void OnReceive(object sender, EventChannelReceiveArgs e)        {           this.Dispatcher.BeginInvoke(() =>           {              Register reg =(Register)e.Message;               txtLog.Text+= string.Format("Name:{0}\r\n",reg.Name);               txtLog.Text += string.Format("EMail:{0}\r\n", reg.EMail);           });        }        private void OnError(object sender, EventChannelErrorArgs e)        {            this.Dispatcher.BeginInvoke(() =>            {                this.txtStatus.Content = e.Error.Message;            });        }        private void OnConnected(object sender, EventChannelArges e)        {            this.Dispatcher.BeginInvoke(() =>            {                this.txtStatus.Content = "Connected!";                this.cmdRegister.IsEnabled = true;            });        }

    定义消息

public class Register:IMessage    {        public string Name;        public string EMail;        public void Save(BufferWriter writer)        {            writer.Write(Name);            writer.Write(EMail);        }        public void Load(BufferReader reader)        {            Name = reader.ReadString();            EMail = reader.ReadString();        }    }

   发送消息

Register reg = new Register();            reg.Name = txtName.Text;            reg.EMail = txtEMail.Text;            mChannel.Send(reg);            //以上消息的封装格式是            int32    //总长度 4byte            int32    //消息类型名称长度 4byte            string   //消息名称utf8编码 byte[]            int32    // Name长度4byte            string   // Name utf8编码 byte[]            int32     //EMail 长度4byte            string   // EMail utf8编码byte[]

    以上协义格式相信做过socket通讯的朋友都比较熟悉,这样的协议分析c++,java也是很方便就能处理得到.如果你对这个组件感兴趣可以到以下地址获取完整代码

转载地址:http://mlcil.baihongyu.com/

你可能感兴趣的文章
mysql忘记密码解决方法
查看>>
Eclipse安装m2eclipse插件(Maven)
查看>>
windows 下最快搭建svn服务器方法
查看>>
获取android系统外置存储卡路径的方法
查看>>
mysql 链接错误
查看>>
php 数组字符串搜索array_search技巧
查看>>
hive中的NULL
查看>>
进程死锁(银行家算法)
查看>>
FragmentTransaction add 和 replace 完全解析
查看>>
1. ASIHttpRequest-创建和执行request
查看>>
mysql中某张表修改较大时的处理
查看>>
如何退出telnet界面
查看>>
nginx+多个tomcat配置
查看>>
sublime实用插件-持续更新
查看>>
DotImage使用教程:从数据库中读写图像
查看>>
行业虚拟化发展趋势——“瑞友杯”虚拟化征文
查看>>
XY问题在开发中的体现
查看>>
更换或加装网卡的eth编号顺序配置
查看>>
Executors下面的线程池实现
查看>>
锐捷CCNA系列(五) 交换机配置模式切换
查看>>