小弟手里最近有个一个项目想用c#来做,因为过程需要和硬件设备进行数据交换,采用C/S设计比较好。由于以前都的程序都是使用的程序 < - > 数据库 的模式,未有多客户端加服务器的模式。这个程序需要和内网机外网的客户端进行通讯。socket方面自己没有问题,但是在关于程序架构设计方面自己一直很困惑,所以来到这里寻求帮助,希望前辈们能够不吝赐教,指点迷津!
项目整体的架构是 客户端 -- 服务器 --- 数据库 的模式,服务器使用Sql server ,客户端通过socket从服务器获取数据而不直接访问数据库(这个涉及到数据同步问题,所以不能直接访问数据库,否则会产生“脏数据”的可能)。服务器的设计结构为数据访问层(DAL)、业务逻辑层(BLL)和传输控制层(TCL),客户端采用缓冲机制,客户机正常联网时数据实时传输,一旦断网可以缓存到本地,再次连接到服务器时同步上传。小弟的困惑是:
1、客户端和服务器端采用异步TCP协议,二者需要定义个协议,如何实现这个协议确保数据稳定传输?我的想法是:定义一个传输对象,TransferObject, 该对象包含客户端的编号,请求编号,服务器处理编号,请求的命令,附加的数据。客户端请求数据时封装一个对象,把自己的编号,请求的编号(GUID),命令,命令附加数据放到对象里面。服务器收到这个对象后进行解析,然后把执行结果也封装一个对象返回给客户端。现在的问题是由于采用异步传输,服务器如何验证客户端数据发送完了,并且验证数据的完整性?服务器给客户端发送数据时有两种方式:一、使用已经建立的客户端的socket发送,客户端如何知道服务器已经把数据返回了;二、客户端也有自己的监听端口,服务器把处理结果发送至该端口,客户端收到这个数据时怎么去和前期的那个请求命令进行关联处理?
2、按照程序设计的思想,一般都是高层组件调用底层。网络传输层应该视为底层,只是负责数据传输,应该被其他模块调用,如何实现控制层对网络传输层的控制,而不是网络传输层调用控制层?另外,如果不好实现是否应该把传输和控制合并到一个模块里面?
本人刚刚接触这个领域,希望各位前辈不要见效,并能够给予多多指导!如果能够提供实例就更好了!谢谢!