一款轻量级的桌面WebServer通讯组件
作者:肖波
个人博客:http://blog.csdn.net/eaglet ; http://www.cnblogs.com/eaglet
2007/7 南京
背景
随着互联网的不断发展,传统的Web应用程序已经不能完全满足用户的需要。由于桌面应用程序相比Web应用程序可以实现更多的功能,并相比Web应用程序更容易访问本地资源,所以一些界于BS架构和CS架构之间的桌面应用(如瘦客户端)便应运而生,这些桌面应用在客户机上以WinForm的形式存在,而服务器侧依然是Web Server。这种体系架构需要桌面应用程序和Web Server之间可以有效通讯,一般的做法是通过Web Service 来实现桌面和Web Server之间的通讯,但Web Service的设计初衷并非是用于通讯,而是更侧重于对远程服务的调用,其体系结构相对比较复杂,如果仅仅用来通讯,难免让人感觉大材小用。介于此,我开发了一款轻量级的Web通讯组件,调用者只需调用一个函数就可以将桌面应用程序中需要通讯的对象发送到Web应用程序中,并可以从Web应用程序获得其响应的对象,如果调用者需要发送加密消息,该组件提供了发送加密消息的方法,同样是非常简单。
工作原理
图1 Web Comm 组件工作原理
如图1 所示,Web Comm 组件提供两个发送消息的方法:SendMsg和SendSecMsg,分别提供发送普通消息和发送加密消息的接口。
发送普通消息很简单,发送侧对要发送的消息对象序列化,接受侧对消息对象反序列化。
发送加密消息的过程是先获取Web Server 侧的非对称加密公钥,这个过程在进程存续期间只进行一次。然后随机产生一个DES 对称加密的密钥,消息体用对称加密密钥加密,对称加密密钥用非对称加密公钥加密,即在应用层和传输层之间加入了一个加密层,类似SSL的原理。
使用说明
桌面侧调用接口
发送普通消息接口:WebComm. CCntWebComm. SendMsg
/// <summary>
/// 发送消息
/// 通过这个方法发送消息不进行加密
/// </summary>
/// <param name="url">Web Server的Url</param>
/// <param name="evt">消息事件号</param>
/// <param name="userName">消息归属的用户名</param>
/// <param name="msg">消息体</param>
/// <param name="response">Web Server 响应后返回的消息</param>
/// <exception cref="CCommException">出错触发CCommException异常</exception>
/// <remarks>
/// msg ---> web server
/// response <--- web server
/// </remarks>
public void SendMsg(String url, int evt, object msg, out object response)
发送加密消息接口:WebComm. CCntWebComm. SendSecMsg
/// <summary>
/// 发送安全消息
/// 通过这个方法发送的消息是进行过加密的。
/// </summary>
/// <param name="url">Web Server的Url</param>
/// <param name="evt">消息事件号</param>
/// <param name="userName">消息归属的用户名</param>
/// <param name="msg">消息体</param>
/// <param name="response">Web Server 响应后返回的消息</param>
/// <exception cref="CCommException">出错触发CCommException异常</exception>
/// <remarks>
/// msg ---> web server
/// response <--- web server
/// </remarks>
public void SendSecMsg(String url, int evt, object msg, out object response)
Web Server 侧接口
Web Server 侧作为消息的接受侧只需要将接受消息的页面做如下处理,即可以实现和桌面应用程序通讯。
1、 页面程序从 WebComm.CWSMsgBase 继承
例如 public partial class _Default : WebComm.CWSMsgBase
2、 重载Page_Load
new protected void Page_Load(object sender, EventArgs e)
{
base.Page_Load(sender, e);
}
3、 重载消息接受函数 ProcessMessage
protected override void ProcessMessage(int evt, object msg, out object response)
{
//处理接受的消息
}
错误码
[Serializable]
public enum T_CommError
{
Success = 0,
/// <summary>
/// 序列化错误
/// </summary>
SerializationFail = 100,
/// <summary>
/// 反序列化
/// </summary>
DeserializationFail = 101,
/// <summary>
/// DES 加密错误
/// </summary>
DesEncryptFail = 102,
/// <summary>
/// DES 解密错误
/// </summary>
DesDecryptFail = 103,
/// <summary>
/// 流转换为字符串错误
/// </summary>
StreamToStringFail = 104,
/// <summary>
/// 字符串转换为流错误
/// </summary>
StringToStreamFail = 105,
/// <summary>
/// 字符串到Base64错误
/// </summary>
StringToBase64Fail = 106,
/// <summary>
/// Base64到字符串错误
/// </summary>
Base64ToStringFail = 107,
/// <summary>
/// 无效的响应
/// </summary>
InvalidResponse = 108,
/// <summary>
/// 空的公钥
/// </summary>
EmptyPubkey = 109,
/// <summary>
/// 无效的公钥
/// </summary>
InvalidPubkey = 110,
/// <summary>
/// 无效的事件号
/// </summary>
InvalidEvent = 111,
/// <summary>
/// 连接错误
/// </summary>
ConnectFail = 500,
//服务器侧错误
/// <summary>
/// 读取参数错误
/// </summary>
SvrParaFail = 10000,
/// <summary>
/// RSA 解密错误
/// </summary>
RSAFail = 10001,
/// <summary>
/// 未知错误
/// </summary>
Unknow = 65535,
}
注意事项
1、 由于发送消息过程需要对消息进行序列化和反序列化,所以需要被发送的消息必须可以被序列化,其实很简单,就是所有需要发送的消息类都要实现 [Serializable] 属性
2、 1000 以下的消息号为系统保留,发送消息时消息号必须大于等于1000
示例程序说明
桌面侧的示例程序在Simple目录下,其完成向Web Server 中接收消息的URL发送普通消息和加密消息,消息体为一个整数
发送普通消息的调用过程
private void buttonSendMsg_Click(object sender, EventArgs e)
{
int msg = (int)numericUpDownData.Value;
object response;
try
{
m_CntWebComm.SendMsg(textBoxUrl.Text, 1200, msg, out response);
if (response != null)
{
if (response is T_SrvError)
{
T_SrvError error = (T_SrvError)response;
CMsgBox.ShowErrorMessageBox(String.Format("code={0}, errmsg={1}, stack:\r\n{2}",
error.Error, error.ErrMsg, error.StackTrace));
}
else
{
numericUpDownData.Value = (int)response;
}
}
}
catch (CCommException ce)
{
CMsgBox.ShowErrorMessageBox(String.Format("code={0}, errmsg={1}",
ce.ErrorCode, ce.Message));
}
catch (Exception e1)
{
CMsgBox.ShowErrorMessageBox(String.Format("errmsg={0}",
e1.Message));
}
}
发送加密消息的调用过程
private void buttonSendSecMsg_Click(object sender, EventArgs e)
{
int msg = (int)numericUpDownData.Value;
object response;
try
{
m_CntWebComm.SendSecMsg(textBoxUrl.Text, 1200, msg, out response);
if (response != null)
{
if (response is T_SrvError)
{
T_SrvError error = (T_SrvError)response;
CMsgBox.ShowErrorMessageBox(String.Format("code={0}, errmsg={1}, stack:\r\n{2}",
error.Error, error.ErrMsg, error.StackTrace));
}
else
{
numericUpDownData.Value = (int)response;
}
}
}
catch (CCommException ce)
{
CMsgBox.ShowErrorMessageBox(String.Format("code={0}, errmsg={1}",
ce.ErrorCode, ce.Message));
}
catch (Exception e1)
{
CMsgBox.ShowErrorMessageBox(String.Format("errmsg={0}",
e1.Message));
}
}
Web Server 侧的示例程序是Web 目录下的WebMsg.aspx,其接收到Simple发送来的消息后将消息体加1后通过Response返回给Simple,Simple得到这个返回值后用这个值更新当前的消息值。
以下代码是Web Server侧接收消息的处理代码
protected override void ProcessMessage(int evt, object msg, out object response)
{
switch (evt)
{
case 1200:
int i = (int)msg;
i++;
response = i;
break;
default:
response = null;
break;
}
}
开源代码
http://files.cnblogs.com/eaglet/WebComm_V1.0.1.rar
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mengyao/archive/2007/09/11/1781132.aspx
转载于:https://www.cnblogs.com/China-Dragon/archive/2010/03/12/1684106.html
一款轻量级的桌面WebServer通讯组件相关推荐
- 5款最佳Linux桌面环境的优缺点比较
如果你刚接触Linux,那么我确信你准花了大量的时间为你的Linux发行版选择桌面环境.你可能在想每一种桌面环境都试一下,不过这很耗费时间.外头有好多优秀的桌面环境.这就是为什么我测评了5款最佳Lin ...
- [开源] .NETCore websocket 即时通讯组件---ImCore
ImCore 利用 webSocket 协议实现简易.高性能.集群即时通讯组件,支持点对点通讯.群聊通讯.上线下线事件消息等众多实用性功能. Quick Start dotnet add packag ...
- linux桌面效率提高,ElementaryOS:使用这个轻量级 Linux 桌面提高工作效率
原标题:ElementaryOS:使用这个轻量级 Linux 桌面提高工作效率 ElementaryOS 提供了一个快速.轻量.高效的桌面,让你在新的一年里保持工作效率. 在前几年,这个年度系列报道了 ...
- 别再用硬编码写业务流程了,试试这款轻量级流程编排框架
前言 在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻辑,几乎每个需求都和这些核心业务有关,这些核心业务业务逻辑冗长,涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取, ...
- SignalR循序渐进(三)简易的集群通讯组件
上一篇演示了泛型Hub的实现,微软于6月17日更新了SignalR 2.1.0,然后自带了泛型Hub,于是就不需要自己去实现了-(微软你为啥不早一个月自带啊-).不过没关系,SignalR出彩之处不在 ...
- 从零开发一款轻量级滑动验证码插件(深度复盘)
关注并将「趣谈前端」设为星标 每天定时分享技术干货/优秀开源/技术思维 github地址: https://github.com/MrXujiang/react-slider-vertify 之前一直 ...
- 【IM开源推荐】前微信技术专家打造的开源的即时通讯组件OpenIM
Open-IM是由前微信技术专家打造的***开源***的即时通讯组件.Open-IM包括IM服务端和客户端SDK,实现了高性能.轻量级.易扩展等重要特性.开发者通过集成Open-IM组件,并私有化部署 ...
- 跨桌面端之组件化实践
本文主要介绍了千牛PC跨端框架中,我们关于组件化部分的思考.方案选择.遇到的一些问题和解法. 此文为本系列文章第三篇, 第一篇:跨全端SDK技术演进 第二篇:跨桌面端之Web容器演进 本文:跨桌面端之 ...
- 开源推荐! 一款开箱即用的电子签名组件
作者: 徐小夕 演示地址: http://h5.dooring.cn/react-sign hello, 大家好, 我是徐夕, 今天又到了分享时间. 今天和大家分享一下我最近开源的轻量级电子签名组件- ...
最新文章
- java异常例子_java 异常的实例详解
- 用Python轻松搞定Excel中的20个常用操作
- python基础代码事例-数据科学Python基础(附示例代码和练习题目)
- 河北计算机辅助普通话试题,115-河北省计算机辅助普通话水平测试培训.pptx
- 系统服务有多个mysql_windows系统中安装多个Mysql服务
- 将Notepad++配置成Java轻量级的IDE
- 她,既是一个风华绝代的演员,更是WiFi之母...
- mysql 存储过程 插入记录_mysql 存储过程 插入记录
- 第二轮冲刺-Runner站立会议08
- BugTracker.NET安装指南
- python读取枚举_在python中枚举(enumerate in python)
- java错误页面_java自定义错误页面实现方法
- VC MFC列表视图(CListCtrl)控件
- 中国农业主导市场趋势报告、技术动态创新及市场预测
- Linux 内核 cgroups 新漏洞可导致攻击者逃逸容器
- react组件卸载调用的方法_React组件如何还能跑得再快一点
- linux 种子文件怎么打开,torrent是什么文件?用什么打开?
- 云流化是什么?对软件企业有什么好处?
- 被误解的鸟枪换炮:实体资产通证化没那么容易
- 02-CSS基础与进阶-day7_2018-09-07-20-25-28
热门文章
- 雷林鹏分享:XML 命名空间
- js-----第四篇
- 深度学习 Deep LearningUFLDL 最新Tutorial 学习笔记 2:Logistic Regression
- 手动修改网卡接口模式从网桥变为路由
- 清空SQL Server数据库日志的SQL语句
- OpenGL鼠标拾取
- 解决Multiple dex files define Lcom/qq/e/ads/ADActivity;
- Android基础--tools:context=.TestActivity作用
- Activity向Fragment传值
- mongodb数据合并设计_MongoDB:如何将来自多个集合的数据合并成一个.?