zoukankan      html  css  js  c++  java
  • c#网络通信框架networkcomms内核解析之三 消息同步调用

    networkcomms.net 来自英国的网络通信框架 官方网址 www.networkcomms.net 中文网址www.networkcomms.cn

    客户端发送消息给服务器,服务器计算结果返回给客户端,这是网络通信应用程序中常见的使用情境。

    拿用户登录举例子,客户端把包含用户名和密码的契约类发送给服务器,服务器从数据获取数据后与收到的契约类数据进行对比,如果一致,返回登录成功的信息,如果不一致,返回登陆不成功的信息

    NetworkComms框架支持消息的同步调用,就像调用本地方法一般。

    举例说明(本例中使用networkcomms v3语法):

       用户登录

        契约类1  UserInfo 用于存储用户名和密码,并传递到服务器端    

    复制代码
     [ProtoContract]    public  class UserInfo    {        [ProtoMember(1)]        public string UserID;        [ProtoMember(2)]        public string Password;        public UserInfo() { }        public UserInfo(string userID, string password)        {            this.UserID = userID;            this.Password = password;        }    }
    复制代码

    契约类2  ResMessage  用于存储服务器返回给客户端的消息

    复制代码
     [ProtoContract]    public class ResMessage    {        [ProtoMember(1)]        public string Message;        public ResMessage() { }        public ResMessage(string message)        {            this.Message = message;        }    }
    复制代码

    客户端:

    复制代码
                        //声明一个契约类                    UserInfo userInfo = new UserInfo();                    //给契约类的用户ID赋值                    userInfo.UserID = txtUserID.Text.Trim();                    //给契约类的用户密码赋值                    userInfo.Password = txtPassword.Text.Trim();                     //把UserInfo的契约类消息发送给服务器端,并获取返回的ResMessage类型的契约类消息                       ResMessage loginContract = newTcpConnection.SendReceiveObject<UserInfo, ResMessage>("UserLogin", "ResUserLogin", 8000, userInfo);                    //下面是获取到服务器返回结果的处理方法                    if(loginContract.Message=="登录成功“)                             MessageBox.Show("登录成功,跳转到下一页面");                    else                             MessageBox.Show("用户名或者密码错误");
    复制代码

     我们来总结一下上面的同步方法调用的格式

                                  

     返回的契约类类型    loginContract=newTcpConnectin.SendReceiveObject<传递的契约类类型,返回的契约类类型>("消息类型“,”消息返回类型",超时时间,契约类实例)  ResMessage loginContract = newTcpConnection.SendReceiveObject<UserInfo, ResMessage>("UserLogin", "ResUserLogin", 8000, userInfo);

    我们看一下服务器端对应的代码

    //为消息类型声明对应的处理器  NetworkComms.AppendGlobalIncomingPacketHandler<UserInfo>("UserLogin", IncomingLoginHandler);

    //具体的处理方法

    复制代码
     //第三个参数为客户端发来的实际契约类类型,networkcomms通信框架自动把二进制数据解析为此类型数据 private void IncomingLoginHandler(PacketHeader header, Connection connection, UserInfo userInfo)        {            try            {                //声明返回的契约类实例                ResMessage  resMessage=new ResMessage();                string userID = userInfo.UserID;                string passWord = userInfo.Password;                //从数据库中验证用户名和密码               if (验证成功)                    //给契约类实例赋值                    resMessage.Message = "登录成功";                else                    resMessage.Message = "用户名密码错误";                //把验证结果返回给客户端                connection.SendObject("ResUserLogin", resMessage);                         }            catch (Exception ex)            {                LogTools.LogException(ex, "IncomingLoginHandler");            }        }
    复制代码
  • 相关阅读:
    QinQ基础知识
    mysql执行sql脚本时--force的作用
    docker的thin pool 和 ulimit问题
    使用MAT来进行java内存问题的简单分析
    自己对DHCP的理解
    根据类名找jar包和maven坐标
    curl在windows下和linux中使用的一个区别
    JAVA实现LRU算法
    经典买票并发
    AQS学习
  • 原文地址:https://www.cnblogs.com/Jeely/p/10972324.html
Copyright © 2011-2022 走看看