zoukankan      html  css  js  c++  java
  • Silverlight socket组件

        在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也是很方便就能处理得到.如果你对这个组件感兴趣可以到以下地址获取完整代码

    https://beetlesl.codeplex.com/

    访问Beetlex的Github
  • 相关阅读:
    简单的php写入数据库类
    php学习笔记――PHP 概述
    php模拟socket一次连接,多次发送数据的实现
    cmseasy安装之strict standards错误
    dropdownlist的用法
    PHP Checkbox获取选中项与
    用php过滤表单提交中的危险html代码
    ‘php.exe’ 不是内部或外部命令,也不是可运行的程序 或批处理文件
    my read_zodiac / 12shengxiao / shenxiao
    hd EMC Navisphere / SAN / NAS / DAS / OMV / openmediavault / FreeNAS / TrueNAS
  • 原文地址:https://www.cnblogs.com/smark/p/2417422.html
Copyright © 2011-2022 走看看