入门.1 部分构建了一个基础的 c/s 程序,
服务器端启动服务
客户端连接
客户端请求服务
获取服务结果
呈现结果
 
 
需改进点:
 
协议和实现分离,协议是服务器,客户端协定的功能集,理应分离出来
 
 
wcf 中
服务通过类型(接口)描述
消息以操作形式出现
消息中结构化数据使用数据协议描述
消息交换模式描述消息发送、接受
 
基于上述知识,扩展并重构 入门.1 中的程序,支持如下功能
 
发送结构化数据
接受结构化数据
异步发送,接受数据(不会有人愿意看到操作线程阻塞等待操作结果。。)
 
基于上述需求,采用双工通讯模型可以完整实现,双工通讯涉及会话,通道等概念,考虑以后实现。。。
 
请求、答复模型会阻塞调用线程,需和本地异步模式绑定,考虑以后实现。。。
 
只剩下单向通信模式了,呃,两个单向组合起来,一个用于服务,一个用于服务应答,分别部署于服务器,客户端即可实现上述需求,虽然土,至少实现了需求。。。
 
暂时选定该方案
 
工程结构描述
server 提供服务
servertoclientprotocal 服务协议
client 使用服务,监听服务应答
clienttoserverprotocal 服务应答协议
 
 
涉及到的类型
indata  输入结构化数据
iser 服务协议
iserresponser 应答接受装置
outdata 输出结构化数据
ser 服务实现
serresponser 服务应答实现
iwriter 接受信息显示
 
关键代码段
 
入门.2.1_休闲服务实现部分,模拟服务计算,延迟 5s 返回
入门.2.1_休闲
入门.2.1_休闲        public class ser : iser
入门.2.1_休闲        {
入门.2.1_休闲                iserresponserClient responser;
入门.2.1_休闲
入门.2.1_休闲iser 成员#region iser 成员
入门.2.1_休闲
入门.2.1_休闲                public void work(indata data)
入门.2.1_休闲                {
入门.2.1_休闲                        System.Threading.Thread.Sleep(5000);
入门.2.1_休闲
入门.2.1_休闲                        var res = new outdata();
入门.2.1_休闲                        res.s = string.Format("[{0}]", data.s);
入门.2.1_休闲                        responser.responsework(res);
入门.2.1_休闲                }
入门.2.1_休闲
入门.2.1_休闲                public void connected()
入门.2.1_休闲                {
入门.2.1_休闲                        responser = new iserresponserClient();
入门.2.1_休闲                }
入门.2.1_休闲
入门.2.1_休闲                #endregion
入门.2.1_休闲        }
入门.2.1_休闲
入门.2.1_休闲服务应答部分,在界面显示应答结果
入门.2.1_休闲
入门.2.1_休闲        public class serresponser : iserresponser
入门.2.1_休闲        {
入门.2.1_休闲                public void responsework(outdata data)
入门.2.1_休闲                {
入门.2.1_休闲                        Program.writer.write(data.s);
入门.2.1_休闲                }
入门.2.1_休闲        }
 
 
流程
服务器启动服务
客户端启动应答服务
客户端连接服务器服务
服务器连接客户端应答服务
客户端请求服务
客户端显示服务结果
 
操作
在界面输入框输入信息 xxx,点击 work,5s 后返回服务器处理结果  [xxx],并显示
 
说明
为了说明界面线程真的没有阻塞,通过定时器在界面线程刷新当前时间(如果阻塞了时间部分不会刷新)
 
采用 winform 客户端,增加可操作性