Beetle.NetPackage是一个多台平开源Client TCP通讯组件,它针对不同平台提供统一的消息描述规则和使用规范可以简单实现多平台下TCP通讯交互.下而介绍通过Beetle.NetPackage简单实地现android和wp聊天.在了解下面的内容之前可以先到Beetle.NetPackage的开源项目了解一下:https://beetlenp.codeplex.com/

  作为一个网络通讯程序首要是制定一个协议明确有那些消息交互,在Beetle.NetPackage中所有协议描述都必须通过对象来描述,并实现一个基础的流读写接口IMessage.聊天需要制定两个消息分别就是登陆和发言.下面分别看一下这两个消息在android和wp下的实现.

  • android

    public class Login implements IMessage {
    
        public String Name;
    @Override
    public void Load(IDataReader stream) throws Exception {
    // TODO Auto-generated method stub
    Name = stream.ReadUTF();
    }
    @Override
    public void Save(IDataWriter stream) throws Exception {
    // TODO Auto-generated method stub
    stream.WriteUTF(Name);
    }
    }
    public class Talk implements IMessage {
    public String Name;
    public String Agent;
    public String Content;
    @Override
    public void Load(IDataReader stream) throws Exception {
    // TODO Auto-generated method stub
    Name = stream.ReadUTF();
    Agent = stream.ReadUTF();
    Content = stream.ReadUTF();
    }
    @Override
    public void Save(IDataWriter stream) throws Exception {
    // TODO Auto-generated method stub
    stream.WriteUTF(Name);
    stream.WriteUTF(Agent);
    stream.WriteUTF(Content);
    }
    }
  • WP8
    public class Login:Beetle.NetPackage.IMessage
    {
    public string Name; public void Load(Beetle.NetPackage.IDataReader reader)
    {
    Name = reader.ReadUTF();
    } public void Save(Beetle.NetPackage.IDataWriter writer)
    {
    writer.WriteUTF(Name);
    }
    }
    public class Talk:Beetle.NetPackage.IMessage
    {
    public string Name;
    public string Content;
    public string Agent;
    public void Load(Beetle.NetPackage.IDataReader reader)
    {
    Name = reader.ReadUTF();
    Agent = reader.ReadUTF();
    Content = reader.ReadUTF();
    }
    public void Save(Beetle.NetPackage.IDataWriter writer)
    {
    writer.WriteUTF(Name);
    writer.WriteUTF(Agent);
    writer.WriteUTF(Content);
    }
    }

  消息描述完成后就针对协议解释对象实现相应的Package

  • android

    public class ChatPackage extends Package {
    
        @Override
    protected void WriteMessageType(IDataWriter writer, IMessage message)
    throws Exception {
    // TODO Auto-generated method stub
    writer.WriteUTF(message.getClass().getSimpleName());
    } @Override
    protected IMessage GetMessage(IDataReader reader) throws Exception {
    // TODO Auto-generated method stub
    String name= reader.ReadUTF();
    if(name.equals("Talk"))
    {
    return new Talk();
    }
    else if(name.equals("Login"))
    {
    return new Login();
    }
    return null;
    }
    }
  • wp8
    public class ChatPackage:Beetle.NetPackage.Package
    {
    protected override void WriteMessageType(Beetle.NetPackage.IDataWriter writer, Beetle.NetPackage.IMessage message)
    {
    writer.WriteUTF(message.GetType().Name);
    } protected override Beetle.NetPackage.IMessage GetMessage(Beetle.NetPackage.IDataReader reader)
    {
    string name = reader.ReadUTF();
    switch (name)
    {
    case "Talk":
    return new Talk();
    case "Login":
    return new Login();
    }
    return null;
    }
    }

  定义了消息和协议解释对象后就可以通过NetClient创建服务端的连接,由于Beetle.NetPackage只是Client端的实现服务就根据自己的需要来编写了,这里方便演示就使用了Beetle作为服务端来进行测试.

  • android

    mClient = new NetClient(getResources().getString(R.string.server_host),
    9088, new ChatPackage(), this);
  • wp8
    mClient = new Beetle.NetPackage.NetClient("192.168.0.104", 9088, new ChatPackage(), this);
    mClient.LittleEndian = false;

  两者定义基于一致,但wp8下NetClient有个LittleEndian属性需要设置,主要原因是android是java数值存储是Big-Endian;而.net默认是Little-Endian因此对应属性要设置False.在编写服务端的时候也应该注意到这一点.以上通讯功能就基础完成,对于数据发送和接收紧紧是消息对象的定义和调用就不多说,详情可以下载源码来了解一下.  

最终看下例子运行的效果:

 下载完整代码:NPChat.rar (2.68 mb)

使用Beetle.NetPackage简单实现android和wp聊天的更多相关文章

  1. 简单实现android和wp聊天

    使用Beetle.NetPackage简单实现android和wp聊天 Beetle.NetPackage是一个多台平开源Client TCP通讯组件,它针对不同平台提供统一的消息描述规则和使用规范可 ...

  2. wp8使用Beetle.NetPackage实现基于TCP通讯的订单查询

    在新版本的Beetle.NetPackage中提供了对Protobuf和Controller的支持,所以在WP8下使用Beetle.NetPackage进行基于TCP的数据交互则一件非常简单事情.下面 ...

  3. android复习第一天-----简单的android常识

    前言:要去面试了,这些天花一些事件把android中简单的知识点来串联的复习一下 1,android中的工程结构 src文件夹:存储android文件的源代码 gen文件夹:有工具自动生成,不要去修改 ...

  4. 一款非常简单的android音乐播放器源码分享给大家

    一款非常简单的android音乐播放器源码分享给大家,该应用虽然很小,大家常用的播放器功能基本实现了,可能有点还不够完善,大家也可以自己完善一下,源码在源码天堂那里已经有了,大家可以到那里下载学习吧. ...

  5. 一个简单的Android小实例

    原文:一个简单的Android小实例 一.配置环境 1.下载intellij idea15 2.安装Android SDK,通过Android SDK管理器安装或卸载Android平台   3.安装J ...

  6. Android高效的应用程序开发工具集1---ant构建一个简单的Android工程

    在java编译那些事通过提到ant编译Java工程,如今扩大到用它来构建Android目,事实上道理是相通的.变化的仅仅是使用的形式.ant构建相比IDE的优点是多个子项目使用自己定义jar包时,an ...

  7. 简单的 Android 拍照并显示以及获取路径后上传

    简单的 Android 拍照并显示以及获取路径后上传 Activity 中的代码,我只贴出重要的事件部分代码 public void doPhoto(View view) { destoryBimap ...

  8. android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】

    android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ...

  9. 我的博客:C# PHP J2ee Java Android js WP Asp.net mvc Python

    <p><A target="_blank" href="http://blog.163.com/hr_company_product/" &g ...

随机推荐

  1. Use try-with-resources

    public void doQueries() throws MyException{ // First try-with-resources. try ( Connection con = Driv ...

  2. Sightseeing trip POJ - 1734 -Floyd 最小环

    POJ - 1734 思路 : Floyd 实质 dp ,优化掉了第三维. dp [ i ] [ j ] [ k ] 指的是前k个点优化后    i  ->  j   的最短路. 所以我们就可以 ...

  3. 部署ceph

    前提:因为ceph部署时要去国外源下载包,导致下载安装时会卡住,因此我们只需通过国内的源找到对应的rpm下载安装. 一.环境准备 4台机器,1台机器当部署节点和客户端,3台ceph节点,ceph节点配 ...

  4. Win10家庭版WindowsUpdate属性为灰色

    一般的取消Windows更新只需要打开任务管理器,点击服务 然后点击左下角的打开服务 找到WindowsUpdate,右键属性 按照正常的电脑只要在启动类型中选择禁用,然后在恢复里的第一次操作选择无操 ...

  5. 用python做一个搜索引擎(Pylucene)

    什么是搜索引擎? 搜索引擎是“对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分”.如图1是搜索引擎的一般结构,信息搜集模块从网络采集信息到网络信息库之中(一般 ...

  6. Extjs小总结

    1.绑定工作流:    INSERT INTO `base_codeclass` VALUES (null, 'PM_CGSQ', '采购申请', null, null, null, '2018-09 ...

  7. Spring Boot MyBatis注解:@MapperScan和@Mapper

    最近参与公司的新项目架构搭建,在使用mybatis的注解时,和同时有了不同意见,同事认为使用@Mapper注解简单明了,而我建议使用@MapperScan,直接将mapper所在的目录扫描进去就行,而 ...

  8. 如何删除github上的某个文件夹

    在github上只能删除仓库,却无法删除文件夹或文件, 所以只能通过命令来解决 首先进入你的master文件夹下, Git Bash Here ,打开命令窗口 $ git –help 帮助命令 $ g ...

  9. Oracle截取JSON字符串内容

    CREATE OR REPLACE FUNCTION PLATFROM.parsejsonstr(p_jsonstr varchar2,startkey varchar2,endkey varchar ...

  10. python学习:购物车程序

    购物车程序 product_list = [ ('mac',9000), ('kindle',800), ('tesla',900000), ('python book',105), ('bike', ...