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"); } }

c#网络通信框架networkcomms内核解析之三 消息同步调用的更多相关文章
- c#网络通信框架networkcomms内核解析之一 消息传送
networkcomms.net 来自英国的网络通信框架 官方网址 www.networkcomms.net 中文网址www.networkcomms.cn 在网络通信程序中,本地的类或者对象,要传输 ...
- c#网络通信框架networkcomms内核解析之一 消息传送2
networkcomms.net 来自英国的网络通信框架 官方网址 www.networkcomms.net 中文网址www.networkcomms.cn 在网络通信程序中,本地的类或者对象,要传输 ...
- c#网络通信框架networkcomms内核解析 序言
NetworkComms网络通信框架序言 networkcomms是我遇到的写的最优美的代码,很喜欢,推荐给大家:) 基于networkcomms2.3.1开源版本( gplv3)协议,写了一些文章, ...
- c#网络通信框架networkcomms内核解析之八 数据包的核心处理器
NetworkComms网络通信框架序言 本文基于networkcomms2.3.1开源版本 gplv3协议 我们先回顾一个 c#网络通信框架networkcomms内核解析之六 处理接收到的二进制 ...
- c#网络通信框架networkcomms内核解析之十 支持优先级的自定义线程池
NetworkComms网络通信框架序言 本例基于networkcomms2.3.1开源版本 gplv3协议 如果networkcomms是一顶皇冠,那么CommsThreadPool(自定义线程池 ...
- c#网络通信框架networkcomms内核解析之九 自定义处理方法的运行机制
NetworkComms网络通信框架序言 本文基于networkcomms2.3.1开源版本 gplv3协议 我们自己写的处理方法都称之为自定义处理方法 比如,我们在服务器上写的与登陆相关的处理方法 ...
- c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据
本文基于networkcomms2.3.1开源版本 gplv3协议 在networkcomms通信系统中,服务器端收到某连接上的数据后,数据会暂时存放在"数据包创建器"(Pack ...
- 循序渐进做项目系列(2):最简单的C/S程序——消息异步调用与消息同步调用
上篇博客 循序渐进做项目系列(1):最简单的C/S程序——让服务器来做加法 实现了一个最简单的C/S程序,即让服务器来做加法.当时为了通俗易懂采用了消息异步调用的方式.今天我们要采用消息同步调用的方式 ...
- 消息同步调用-- ESFramework 4.0 进阶(07)
分布式系统的构建一般有两种模式,一是基于消息(如Tcp,http等),一是基于方法调用(如RPC.WebService.Remoting).深入想一想,它们其实是一回事.如果你了解过.NET的Prox ...
随机推荐
- python reduce()函数使用
reduce()的使用方法形如reduce(function, iterable[, initializer]),它的形式和map()函数一样.不过参数f(x)必须有两个参数,initializer是 ...
- webstorm 去点右边白线
file>settings>editor>general>appearance>show right margin(configured in code style oo ...
- Linux基础-文件管理
<1>查看文件信息:ls ls是英文单词list的简写,其功能为列出目录的内容,是用户最常用的命令之一,它类似于DOS下的dir命令. Linux文件或者目录名称最长可以有265个字符,“ ...
- Opengl 之 窗口初体验 ------ By YDD的铁皮锅
大二的时候开始想着做游戏,因为学校的课程实在是无聊就想着做些有意义的事情.毕竟学了编程这一行就得做些实事,于是就在网上搜了一下图形编程,偶然的了解到了Opengl (同时还有Windows上的Dire ...
- 前端学习笔记——HTML
1.前端的三把利器 HTML:我们把它比喻成赤裸的一个人 CSS:华丽的衣服 JS/JavaScript:赋予这个人的行为,也就是动起来 2.什么是HTML? HTML 是用来描述网页的一种语言.ht ...
- 线程组,action to be taken after a sampler error
continue:继续运行后面的请求 start next thread loop:后面的请求不执行,重新循环执行 stop thread:停止所有线程(等待正在执行的线程执行完后,失败的请求后面的 ...
- linux中errno及perror的应用
1 perror 定义在头文件<stdlib.h>中 void perror(const char *s);函数说明 perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 ...
- Passive Event Listeners——让页面滑动更加流畅的新特性
Passive Event Listeners - 被动事件监听器 在写webapp页面的时候,Chrome 提醒 code 1 <code>[Violation] Added non-p ...
- Java7任务并行执行神器:Fork&Join框架
Fork/Join是什么? Fork/Join框架是Java7提供的并行执行任务框架,思想是将大任务分解成小任务,然后小任务又可以继续分解,然后每个小任务分别计算出结果再合并起来,最后将汇总的结果作为 ...
- 大型项目必备IPC之Binder机制原理(一)
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680 摘要 Binder是Android系统进程间通信(IPC)方式之一.Li ...