我有几个关于好的编程设计的问题。我将首先描述我正在建设的项目,这样你就可以更好地帮助我了。
我正在编写一个类似于TeamViewer、、CrossLoop的远程辅助工具。它将结合诸如UDP网络(使用利德格伦网络库)、NAT遍历(因为现在许多计算机在路由器后面是不可见的)、镜像驱动程序(使用DF幻影的镜像驱动程序(http://www.demoforge.com/dfmirage.htm)在远程计算机上实时抓取屏幕)等概念。
尽管如此,这个程序有一个客户-服务器体系结构的概念,但是我只制作了一个同时具有客户机和服务器功能的程序。这样,当用户运行我的程序时,他们可以在提供帮助和接受帮助之间切换,而不必下载单独的客户端或服务器模块。
我有一个Windows表单,允许用户在提供帮助和接收帮助之间进行选择。我有另一个Windows窗体用于文件资源管理器模块。我有另一个用于聊天模块的Windows表单。我有另一个Windows窗体,用于注册表编辑器模块。我有另一个Windows窗体用于活动控制模块。因此,我为每个模块提供了一个表单,这就引出了第一个问题:
1.我应该在相应的表单的代码中处理特定于模块的命令吗?意思是,我得到一个命令,其中包含一些数据,这些数据枚举了特定目录的远程用户的文件。显然,我必须在File窗体上更新它,并将条目添加到ListView中。不过,我应该在Windows窗体内处理这些代码吗?或者我应该在另一个类中处理这个问题(当然,我最终必须将数据传递给表单来绘制)。还是类似于混合处理另一个类中的大多数数据,并将最终结果传递给要绘制的表单?
所以我有5-6张表格,每个模块一张。用户启动我的程序,输入远程机器的ID (不是IP,ID,因为我们正在向中间服务器注册以启用NAT遍历)、他们的密码和连接。现在让我们假设连接成功了。然后,向用户提供一个包含所有不同模块的表单。因此,他可以打开一个文件资源管理器,或者他可以扰乱注册表编辑器,或者他可以选择与他的伙伴聊天。所以现在这个程序有点空闲,只是在等待用户做些什么。如果用户打开Live,那么程序将花费大部分时间从远程计算机接收数据包,并将它们绘制到表单中以提供“实时”视图。
2.第二个设计问题。问题1.如何将特定于模块的命令传递给它们各自的Windows窗体?的意思是,我有一个类似"NetworkHandler.cs“的类来检查来自远程计算机的消息。NetworkHandler.cs是一个全局可访问的静态类。因此,假设我得到一个命令,该命令枚举特定目录的远程用户文件。我将如何将该命令“授予”文件资源管理器表单。我正在考虑在OnCommandReceivedEvent中创建一个NetworkHandler,并让每个表单注册到该事件。当NetworkHandler收到命令时,它将引发事件,所有表单都将检查它是否相关,并且适当的表单将采取行动。这是一个合适的/最好的解决方案吗?
3.我使用的网络库Lidgren提供了两个检查网络消息的选项,可以轮询ReadMessage()返回null或消息,也可以使用AutoResetEvent OnMessageReceived (我猜这就像一个事件)。哪一个更合适?
发布于 2010-05-29 21:01:59
https://stackoverflow.com/questions/2936582
复制相似问题