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