问题描述
我是一个网络编程的菜鸟我想知道服务器端如何判断客户端发来的是什么信息,比如客户端需要注册一个人的信息,那服务器收到信息后怎么判断这个信息是用户名还是密码,或者是文件什么的。希望能有具体的代码和注释,谢谢!
解决方案
解决方案二:
协议自己定义就可以了啊,你定义什么包头,什么包体,什么校验,然后客户端按照你定义的规则进行解析不就可以了...
解决方案三:
比如说你使用NewtoneSoft.Json来进行json跟.net内部对象的转换处理。假设我们收到了一个字符串{"SeqNum":10023,"CmdType“:"EnteringRoom","Content":{"RoomId":"1293883","Account":"abc","Pwd":"8899ksdkf82","Expire":5}}
这里,首先,所有的命令都有SeqNum表示序号,"Type"表示命令类型,"Content”表示具体的命令体内容。不同命令,其格式上就是Content部分有所不同。解析时,首先使用varx=JObject.Parse(str);
来得到整个命令,然后根据(string)x["CmdType“]的值,到你的命令字典中找到对应的具体命令(是一个class)在.net程序内部声明Type。varcmd=x["Content"].ToObject(type);
现在,我们就把传过来的命令解析出一个独立的EnteringRoom类型对象,并且赋值给变量cmd了。执行命令更为简单。执行命令就是“输入object,输出object”的函数。在你的程序一开始,需要声明publicstaticDictionary<Type,Func<object,object>>commands=newDictionary<Type,Func<object,object>>();
的一个集合,并且在程序一开始注册给这个集合。例如privateobjectEnter(objectcmd){....}
commands.Add(typeof(EnteringRoom,Enter);//注册Enter方法负责处理以EnteringRoom类型命令
那么根据上述cmd,就可以找到处理程序并进行处理,例如Func<object,object>p;objectresult;if(commands.TryGetCalue(cmd.GetType(),outp))result=p(cmd);elsethrownewException(string.Format("找不到{0}的命令处理程序。",cmd.GetType().FullName));
得到返回值之后,再把它封装为一个完整的命令,返回给发送端即可。例如我们规定返回信息的SeqNum编号为负数表示返回,就可以写vary=newCommnd{SeqNum=-(int)x["SeqNum"],CmdType=result.GetType().Name,Content=JObject.FromObject(result).ToString()};
最后把这个命令y进行json序列化,发送给对方作为返回消息。
解决方案四:
最后我要补充一点儿,上面说的是逻辑上的核心设计概念,这部分是最有特点的,每一个系统的设计方式可以不一样(我们的肯定也比这个复杂一点)。这里并没有什么“包”的概念。因为“包”是一个相对来说没有技术含量的封装层,而上面说的都是包承载的内容用于整个业务处理的流程。对于没有什么技术含量的那层“封装”,才是针对简单的byte[]传递的。在你接收数据时,总是会“粘包”的,因此我们可以这样规定包的格式(举例):1.前4个字节表示整个包的长度;2.然后是上述y内容的json字符串。这就行了。所以“包”本身没有技术含量,不过就是用来让你接收端不会“粘包”的。真正有技术含量的函是对于包中的内容的解析机制。
解决方案五:
我们都知道“只纠结于‘是什么’而不知道‘如何做’的书呆子其实是纸上谈兵做不了什么事的。只有能够准确描述“如何做”,你才能真正开始去做一件事。而且我们看某些人是否能够真正去做一件事,不看他的名词儿说得是否很多,关键是我们要了解他具体的做法。
解决方案六:
嗯,上面我的例子中有一行代码应该是写错了,Content=JObject.FromObject(result).ToString()应该写为Content=JObject.FromObject(result)才对,因为我在举一开始的接收端的例子时,对于Content属性,是做为JObject类型,而不是作为string类型处理的。
解决方案七:
先决定C和S用什么协议链接。最简单的,S就是数据库,C直接用ADO.NET访问数据库就好了。其次,S如果你是个Web站点,那么就是用http,不嫌麻烦(或者为了兼容已有网站)你的C就模拟http提交的表单来和web站点交互,当然也可以自己定义首发的内容,如楼上那些方式。也可以用现成的WebService/WCF来交互处理。最麻烦,某些场景下也是必须的就是用TCP/UDP通信,这样你自己定义两段收发的命令就好了。比如C发过去1,S就知道要注册用户了。