请求下C/S架构 客户端服务器如何交互

思维忒 发布于 2011/09/01 18:10
阅读 4K+
收藏 0

本人没什么C/S架构的开发经验,最近帮人做一个客户管理系统,很多地方不知该如何处理,比较头疼,希望大家指点下...

1) 如何维护用户的登录状态?
   现在我是位置一个长连接,然后每隔几秒发个Ping包,然后如果客户端那边判断session是否可用,然后重试之类的,感觉这样有点山寨...不知道常规的做法是怎样的

2) 客户端如何相应服务端指令?
   服务器的有些指令可能是回复的不及时,比如客户端在上一个查询命令没有返回之前又发送了一个查询,这时两次查询的先后返回了,客户端该怎样相应?直接忽略掉前一条?  这里我主要是对如何交互比较不清楚,客户端一方面要响应用户的事件,一方面还要响应服务器的事件,这个是不是该定义很多种状态,然后不同状态下只能响应特定的事件?

 

对这方面没什么研究,希望大家多多指了个教哇,那个,多谢啊...........

加载中
0
Lunar_Lin
Lunar_Lin

1.   假设你的用户电脑有可能死机,客户端服务端万一恰好中间什么数据交互都没,但你想实时判断出客户端已经死机,那么就需要定时发送一个心跳包,1分钟等间隔就看你想要的精度. 心跳由服务器端发起,客户端响应即可. 若不响应则直接断开.无后续处理.  (如果你不发这个包,服务器和用户之间又的确存在无数年互相不发数据的可能,那么服务器上这个套接字可能白白存放了无数年,但如果不存在这个可能,就没必要发心跳包,毕竟下一次发送  一下就知道了TCP连接超时或者重置了.) 对于某些网络,比如中国移动GPRS,你要是不发任何数据,它过一会就掐断你的IP有效性,这时候就需要用一个定时的数据维持住这个IP.

2. 你说的查询,我觉得这个看你自己需求, 对于服务器先后到来的2个查询.每个包应该带有时间戳,如果嫌"对时"麻烦,那就带能表明先后的ID戳.TCP上包是按顺序的,不会出现后发的先收到,但由于你服务器是多线程的,有可能后收到的请求,先被处理并回复,加个包ID或时间戳.  

3.  状态机形式的编程 在网络编程中是非常常见的.

    你问的问题,我觉得都是要看你具体的逻辑了.实在无法回答.   比如"不同状态下只能响应特定的事件? ", 我要是说了"应该不必要吧."   而你的程序万一是 模拟女生大姨妈来了,而去游泳也算一种事件的话.我就比较无奈了. 呵呵. 看你自己的逻辑.

思维忒
思维忒
感觉你说的很有道理。多谢~
0
鉴客
鉴客
这些其实都是 socket 编程的基础,不妨先读本书?
思维忒
思维忒
你好,其实我就是一直在做socket编程的,但一般写的都是ftp那种服务器,固定的逻辑来处理的,不回一条指令没执行完就来了下一条,所以感觉C/S架构的 还是有些迷惑
0
老盖
老盖

1)client每隔一段时间发一个保活包,server端超过一定时间没收到保活包就认为该客户端挂了,需要重置该客户端用户的登录状态。

2)每条发给server端的指令有一个消息ID,返回时只有ID对应的才会处理。client端内部的事件和服务器端的发的事件要分开处理,可以放在不同线程里。

hunterli
hunterli
@戏水 : 没有做过CS的应用,不是很了解。以BS的形式做CS,比如客户端底层构建在HttpClient之上,服务器直接用普通的Web容器,不知可行性如何。
老盖
老盖
@hunterli : CS和BS可不一样,CS是长连接,BS是短链接,BS的时间长了可以断开,CS需要一直连着
hunterli
hunterli
不用发保活包吧,一段时间没有发请求,服务器直接删除session,提示重新登录,像web容器那样。
0
mallon
mallon
socket太低级了,弄点高级的技术吧,比如服务器端用WebService做接口,客户端使用HTTP Client库(例如libcurl)访问
0
棒桑
还是用b/s吧,后台再跑一些job搞定
返回顶部
顶部