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");
            }
        }
时间: 2024-10-12 12:15:42

c#网络通信框架networkcomms内核解析之三 消息同步调用的相关文章

c#网络通信框架networkcomms内核解析之一 消息传送

networkcomms.net 来自英国的网络通信框架 官方网址 www.networkcomms.net 中文网址www.networkcomms.cn 在网络通信程序中,本地的类或者对象,要传输到通信的另一端,在网络上传输的时候是二进制流的形式. 那么在发送消息的时候要把对象序列化为二进制流 对方接收到二进制数据流要还原成对象. 我们知道使用Tcp协议传输消息的时候有消息边界问题,要解决这个问题,方法有很多,比如: (1)固定尺寸的消息 (2) 使用消息尺寸信息 (3) 使用消息标记 我们

c#网络通信框架networkcomms内核解析 序言

networkcomms是我遇到的写的最优美的代码,很喜欢,推荐给大家:) 基于networkcomms2.3.1开源版本( gplv3)协议,写了一些文章,希望大家喜欢,个人水平有限,不足之处难免. networkcommsc#通信框架来自于美丽的英国剑桥,由大洋彼岸的两位工程师 Marc Fletcher, Matthew Dean开发. c#网络通信框架networkcomms内核解析之一 消息传送 c#网络通信框架networkcomms内核解析之二 消息处理流程 c#网络通信框架net

c#网络通信框架networkcomms内核解析

networkcomms是我遇到的写的最优美的代码,很喜欢,推荐给大家:) 基于networkcomms2.3.1开源版本( gplv3)协议,写了一些文章,希望大家喜欢,个人水平有限,不足之处难免. networkcommsc#通信框架来自于美丽的英国剑桥,由大洋彼岸的两位工程师 Marc Fletcher, Matthew Dean开发. c#网络通信框架networkcomms内核解析之一 消息传送 c#网络通信框架networkcomms内核解析之二 消息处理流程 c#网络通信框架net

c#网络通信框架networkcomms内核解析之八 数据包的核心处理器

我们先回顾一个 c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据 中,主程序把PacketBuilder 中的数据交给核心处理器处理的过程 //创建优先级队列项目 PriorityQueueItem item = new PriorityQueueItem(priority, this, topPacketHeader, packetBuilder.ReadDataSection(packetHeaderSize, topPacketHeader.PayloadPac

c#网络通信框架networkcomms内核解析之十 支持优先级的自定义线程池

本例基于networkcomms2.3.1开源版本  gplv3协议 如果networkcomms是一顶皇冠,那么CommsThreadPool(自定义线程池)就是皇冠上的明珠了,这样说应该不夸张的,她那么优美,简洁,高效. 在 <c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据>中我们曾经提到,服务器收到数据后,如果是系统内部保留类型数据或者是最高优先级数据,系统会在主线程中处理,其他的会交给自定义线程池进行处理. 作为服务器,处理成千上万的连接及数据,单线程性能

c#网络通信框架networkcomms内核解析之二 消息处理流程

networkcomms.net 来自英国的网络通信框架 官方网址 www.networkcomms.net 中文网址www.networkcomms.cn   发送端发送消息给接收端 ,接收端进行处理    举例:客户端把某用户信息(用户ID,用户密码)传输给服务器,服务器存储到数据库中. 发送方 1.契约类(用户信息类) [ProtoContract] public class UserInfo { [ProtoMember(1)] public string UserID; [ProtoM

c#网络通信框架networkcomms内核解析之五 数据监听

在networkcomms中,服务器端可以同步监听数据,也可以异步监听数据. 以开源的networkcomms.2.31为例 服务器端监听代码: protected override void StartIncomingDataListen() { if (!NetworkComms.ConnectionExists(ConnectionInfo.RemoteEndPoint, ConnectionType.TCP)) { CloseConnection(true, 18); throw new

c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据

在networkcomms通信系统中,服务器端收到某连接上的数据后,数据会暂时存放在"数据包创建器"(PacketBuilder)中,PacketBuilder类似一个流动的容器,收到的数据被服务器处理完成后,相应在二进制数据,会从存储他的PacketBuilder中删除. 我们知道在networkcomms的消息体系中,传送的数据的第一个字节用来存储数据包包头长度,解析出数据包包头后,包头中包含数据包长度.所以在读入进入PacketBuilder中的数据,会根据第一个字节中存储的数据

c#网络通信框架networkcomms内核解析之十一 TCP连接与UDP连接

连接是通信的核心 客户端一般只会有一个连接 服务器端会维护成千上万的连接 在服务器端连接的维护工作是由NetworkComms静态类来完成的,当有新的客户端请求,服务器上会创建相应的连接,并把连接注册到NetworkComms静态类中.当连接断开后,NetworkComms通信框架会自动把相应连接的引用从NetworkComms静态类中删除. 连接的类图: 在V3以上版本中,数据监听部分已从Connnection类中提取出去成为一个单独的类: TCPConnectionListener   ,使