C# C/S模式的服务器端如何判断客户端发来的是什么信息

问题描述

我是一个网络编程的菜鸟我想知道服务器端如何判断客户端发来的是什么信息,比如客户端需要注册一个人的信息,那服务器收到信息后怎么判断这个信息是用户名还是密码,或者是文件什么的。希望能有具体的代码和注释,谢谢!

解决方案

解决方案二:
协议自己定义就可以了啊,你定义什么包头,什么包体,什么校验,然后客户端按照你定义的规则进行解析不就可以了...
解决方案三:
比如说你使用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就知道要注册用户了。

时间: 2024-10-02 01:43:38

C# C/S模式的服务器端如何判断客户端发来的是什么信息的相关文章

sql数据库关系模式-关系模式中的范式判断题

问题描述 关系模式中的范式判断题 R=(A,B,C),F=(A→B,B→A,C→A),请问这是第几范式?求大神解析 解决方案 答案是第三范式.... 解决方案二: 关系模式的范式关系模式及其范式关系模式的范式 解决方案三: http://zhidao.baidu.com/question/143865990.html 解决方案四: 第二范式........吧 解决方案五: 根据题意,其主键为B,C. 而A存在与主键的部分依赖, 所以属于第一范式. 解决方案六: 2NF 关系的第一范式(1NF)定

网络编程-在无数据传输时服务器端怎样检测客户端已经断开

问题描述 在无数据传输时服务器端怎样检测客户端已经断开 windows下的一个服务器程序,在数据传输过程中如果客户端断开了,send函数发送失败即可知道后端断开了,那如果没有数据传输时怎样判断?除了发探测包还有其他好的方法吗? 解决方案 如果是客户端主动关闭,那么服务端select会返回,并告知该套接字可读,这时调用recv会返回0.一般而言,可以使用心跳机制,也可以给每个连接设置非活动状态超时值. 解决方案二: 针对您的这个问题不管您最后想出了什么好方法最后都离不开发送探测包... 解决方案三

怎么判断客户端掉线

问题描述 多个客户端对一个服务端发送数据,用的一个线程,怎么判断哪个客户端掉线?需要每个客户端都开一个线程么? 解决方案 解决方案二:没必要,客户端socket信息里面有部分字段包含自身标志位就可以了,服务端定时轮询,超出时间的就是掉线了解决方案三:长链接不需要判断,否则需要轮询解决方案四:连接无数据交互,超过设定的timeout时间,就可以认为掉线解决方案五:socket掉线会引发异常的.你无需担心...解决方案六:网络中的接收和发送数据都是使用SOCKET进行实现.但是如果此套接字已经断开,

PHP判断客户端的浏览器类型

  判断客户端浏览器类型     01 /** 02  * 判断浏览器名称和版本 03  */ 04 function get_user_browser() 05 { 06     if (empty($_SERVER['HTTP_USER_AGENT'])) 07     { 08         return ''; 09     } 10   11     $agent       = $_SERVER['HTTP_USER_AGENT']; 12     $browser     = '

ASP判断客户端浏览器语言自动跳转

<% dim lan lan=request.servervariables("http_accept_language") select case 1 case instr(lan,"zh-cn") response.redirect("http://www.3lian.com//cn/index.asp教程") '判断客户端是否是中文简体,如果是转向/cn/index.asp case instr(lan,"zh-tw&quo

asp 判断客户端操作系统

判断客户端操作系统  Function GetOs(content,systemOrBrowser)   Dim temp   temp = Split(content,";")   Select Case systemOrBrowser    Case 0     If InStr(Content,"Windows NT 6.0") Then      GetOs = "Windows Vista"     ElseIf InStr(Conte

js判断客户端是iOS还是Android等移动终端的方法

 本文为大家介绍下使用js判断客户端是iOS还是Android等移动终端,示例代码如下,感兴趣的朋友可以参考下  判断原理:    JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一种是通过分析浏览器的userAgent属性来判断的.在许多情况下,值判断出浏览器类型之后,还需判断浏览器版本才能处理兼容性问题,而判断浏览器的版本一般只能通过分析浏览器

微信服务号开发模式下,如何获取用户发送给服务号的信息,转给客服,再将客服回答信息转给用户?

问题描述 微信服务号开发模式下,如何获取用户发送给服务号的信息,转给客服,再将客服回答信息转给用户? 开发一个微信转接接口,需求是:微信服务号在开发者模式下,也就是有基本配置(服务器配置),获取到用户向服务号发送的信息,转接到在线客服,然后客服回答的信息在转接到用户,起到转接作用. 解决方案 收到信息后回复success或者空内容,保存微信发送的相关信息:http://mp.weixin.qq.com/wiki/1/6239b44c206cab9145b1d52c67e6c551.html 怎么

java服务端如何实现对安卓和苹果客户端发来的不同数据格式进行处理和判断?

问题描述 java服务端如何实现对安卓和苹果客户端发来的不同数据格式进行处理和判断? 服务端是java写的,安卓客户端与服务端通信是用java的对象流,直接传对象进行socket通信,但是苹果的客户端不能采用这种方式,现苹果客户端打算用json 格式的字符串与服务端进行socket通信,请问大神们,我该如何对客户端传来的socket流进行判断,到底是安卓发来的还是苹果发来的呢?谢谢! 解决方案 都使用json,不同的客户端用一个字段表示,服务器判断下 解决方案二: 加上信息头,里面包括设备类型,