当前位置: 首页 > 编程语言 > C#

为网络应用程序设计帮助?Share

时间:2023-04-10 16:06:14 C#

帮助设计网页应用程序?注意这是一个很大的问题,所以请耐心等待,如果不清楚,我提前道歉。为了使这个问题易于管理并尽量减少混淆,我省略了复制和粘贴该类的某些属性。上下文我正在编写一个网络应用程序——一种“远程桌面”应用程序,以便普通技术人员可以帮助他的朋友或邻居解决计算机问题。我意识到存在像TeamViewer这样的免费和更高级的软件,但这个问题没有讨论创建它的实用性。常用术语客户是技术员,助手–控制员。服务器是“受害者”,遇难者。客户端通常是向服务器发出命令的客户端。信息该软件不仅仅是一个实时查看/控制应用程序。我想要额外的模块,例如文件浏览器模块和聊天模块(这样他们就可以在不使用额外的即时消息软件的情况下进行通信)。最初,我通过UDP发送和接收消息的方法是手动且低效的。(我将Lidgren库用于UDP网络,这就是为什么我的数据包不显示低级字节,如标头消息大小。)OriginalPacketStructure:ByteIndexTypePurpose/Description----------------------------------------------------0字节预期目标模块(例如1->聊天模块)1字节该模块执行的命令(例如0->NewChatMessage)2字节加密/压缩flag3字节数据包优先级标志(例如取消数据包应该首先处理)4-X?变量类型的特定于命令的参数(例如,对于本例,参数将是实际的聊天消息文本)一旦我收到100多条消息,此方法就变得难以包装。来源变得神秘,修改是一件苦差事。即使将“目标模块”和“命令”编码为枚举(仍然是间接数字),开发应用程序仍然很困难。在收到这些数据包时解析特定于命令的参数变成了一个非常长的切换阶梯,嵌套在一个长得离谱的if-else阶梯中。后来我决定对我的数据包结构使用序列化。我现在可以将每个命令设计为一个类,然后将其序列化为紧凑的字节数组(或字符串),然后将其反序列化为其原始类并将参数作为类属性读取。这似乎更容易,我愿意为更大的序列化数据结构支付带宽成本。修订后的数据包结构:字节索引类型目的/描述------------------------------------------------------0-XString序列化类问题但是这个问题是设计问题之一。序列化和反序列化我的类没有问题。问题是我如何设计命令/数据包类。我发现自己坚持下去。我的课程设计如下:数据包基础类//////网络通信的基本单元,可以从客户端到服务器进行传输和接收。包含目标模块和特定于模块的命令。///publicclassPacket{//////指定将此数据包转发到的模块。///publicModuleDestinationModule{get;放;}//////指定此数据包是加密的还是压缩的。///publicEncryptionCompressionFlagEncryptedOrCompressed{get;放;}//////指定数据包的优先级。///publicPacketPriority优先级{get;放;}}欢迎模块数据包库(更多相关信息如下)//////特定于此模块的数据包的基本数据包结构。添加来自基Packet类的ModuleCommand属性。///publicclassWelcomeModulePacket:Packet{//////指定此特定数据包指示模块执行的命令编号。///publicModuleCommand命令{get;放;}}//////指定此模块的命令乐。///publicenumModuleCommand:byte{//////用户刚刚点击了连接按钮(在表单的GUI上)并发送了这个连接数据包。///ClientRequestingConnectionPacket=0,}'WelcomeModulePacket'class解释:因为我有两个以上的模块,所以只有一个枚举'CommandModule'枚举所有模块的每个命令,这将是一个很长的枚举并且非常混乱,这就是为什么我有一个不同的对于每个模块'ModuleCommand'枚举。连接包//////用户刚刚在客户端的欢迎窗体上点击了“连接”。客户端现在请求连接到服务器。///publicclassClientRequestingConnectionPacket:WelcomeModulePacket{publicstringUsername{get;放;}公共字符串密码{得到;放;所以,你可以看到我的类不仅有两层继承,还有三层。ClientRequestingConnectionPacket:WelcomeModulePacket:Packet当我将特定数据包(如“ClientRequestingConnectionPacket”)存储到不太具体的数据结构中时,此设计的问题就变得很明显。例如,将“ClientRequestingConnectionPacket”排入通用PriorityQueue(为了确定优先级,请记住“Packet”类如何具有“PacketPriority”属性)。当我将此数据包出列时,它会作为数据包而不是ClientRequestingConnectionPacket出列。在这种情况下,由于那里只有一个数据包,我显然知道数据包的原始类型是ClientRequestingConnectionPacket,但是当我在队列中存储数百个数据包时,我无法知道要抛出的原始数据包的具体类型在回去。所以我做了一些奇怪的添加,比如添加这个属性:TypeUltimateType{get;放;}到'Packet'基类。但我的意思是,这个“解决方案”看起来真的很勉强和原始,我不认为这是一个真正的解决方案。那么,根据上面其他StackOverflow问题的链接,我是否犯了这个错误?我该如何解决?这个叫什么?我应该如何设计我的应用程序?修改后的问题:什么是适合Packet类的设计模式?您可以按照FishBasketGordo的建议使用GetType,或者您可以使用isif(packetisClientRequestingConnectionPacket){/*dosomething*/}elseif(packetisSomeOtherPacket)....测试类型。反序列化对象时,调用GetType是什么返回?如果我没记错的话,它将是实际的特定类型,而不是一般的基本类型。这样您就需要添加一个额外的属性来了解实际类型。这就是C#学习教程:为网络应用程序设计帮助?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: