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");
            }
        }
复制代码

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.net 稳定 高效 易用 可同步 TCP 通信框架 使用平台: WinXP,WIN7,WIN8,WINCE,WINPHONE。 使用.net 2.0 框架。 主要功能介绍: 1、可以代替 Oracle,Mysql客户端 在不安装Oracle,MySql客户端的情况下访问, 对数据库进行间接访问(需开始框架的服务器端)。 2、可以使本来没有网经功能的Sqlite具有网络访问的能力。(也是需要开启服务器端) 以上两点可以兼容现有代码生成器时,客户端代码仅需要特别小的改动就可以。 3、基本功能。可以实现聊天,传文件,图片。 4、使用长连接,有断线自动连接功能,心跳包。 5、使用自定义数据包协议,自建Session机制加强数据连接安全。 6、框架稳定,支持高并发。 7、简单的事件处理机制。使用更加简单。 8、支持同步处理,使程序的开发更架简单,不需要另行回调处理。 下载地址: 使用方式: 首选需要 引用 DataUtils.v1.1.dll。DataUtils 内包含客户端与服务器端 处理类。 1、服务器端 代码示例。 设置服务器端默认端口 ,不设置端口会使用默认端口 TcpSettings.DefultPort = 8511; 既可以使用静态默认对象,也可以创建服务器端对象。 SocketListener server= new SocketListener(); 对象创建后 注册一些事件,以接收客户端发送的信息。 SocketListener.Server.RegeditSession += new Feng.Net.Tcp.SocketListener.RegeditSessionEventHandler(server_RegeditSession); RegeditSession 事件用于是否允许客户端连接此服务器。可以使用用户名,密码的核对方式。 SocketListener.Server.DataReceive += new SocketListener.DataReceiveEventHandler(server_DataReceive); DataReceive 在这个事件里处理接收到的数据。 事件注册完成就可以打开监听 SocketListener.Server.StartListening(); 2、客户端 代码示例 设置服务器的IP地址 TcpSettings.DeafultIPAddress = "192.168.1.3"; TcpSettings.DefultPort = 8511;//不设置端口会使用默认端口。 这样就可以使用默认的静态客户端了。 也可以自己创建对象。 客户端创建后需要在Connected事件注册用户,以限制某些用户是否可以使此链接。用户来源可以是数据库等。 void client_Connected(object sender, SocketClient sh) { Client.RegeditSession("aaa", "bbb"); } 发送文字消息给其他用户 SocketClient.Client.SendToOtherUser(string user, string text); //USER代表发达的目白用户,text表示为发送的内容。 发送图片,音频,视屏可以使用 SocketClient..SendToOtherUser(string user, byte[] data)////USER代表发达的目白用户,data表示为发送的内容。 data数据中数据有多种类型时可以使用 using (Feng.IO.BufferWriter bw = new Feng.IO.BufferWriter()) { bw.WriteBitmap(new Bitmap(100, 100)); bw.Write(text);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值