用python写1个简单的聊天服务器4-协议设计与处理
2013-06-28 17:50
477 查看
因为tcp是数据流。所以1段数据可能会被分开发送或者接收,这样在服务器接受以后就存在1个问题。如何确认获取到的协议完整性?
这就需要服务器粘包处理。
C++游戏服务器协议部分一般都是采用 包长+协议号+数据
通过读取2或者4个字节包长,根据包长从数据流中提取固定长度的内容,然后判断协议号,对应到struct以后提取数据。
想一下最终决定采用json格式。
协议
提交部分
其中length为整个json的长度
action为方法。
剩下的为提交的字段
返回
服务器端发送与返回一致。
status - 状态 1成功,0异常
action - 方法
errcode - 错误号码
datas - 返回的内容,可以为空
server.py服务器接收到以后
投递到tcpstreampackage.py处理
搜索"length : " 得到长度,以后提取协议。然后对应action,以后反射得到协议对象。
部分代码
解析协议
这就需要服务器粘包处理。
C++游戏服务器协议部分一般都是采用 包长+协议号+数据
通过读取2或者4个字节包长,根据包长从数据流中提取固定长度的内容,然后判断协议号,对应到struct以后提取数据。
想一下最终决定采用json格式。
协议
提交部分
{ "lentgh":12, "action":"register", "username":"watsy", "password":"123456" }
其中length为整个json的长度
action为方法。
剩下的为提交的字段
返回
{ "status":1, "errcode":0, "action":"login", "datas":{ "uid":1, "name":"watsy", "head":"xxxx.jpg", "description":"hello world", "token":"abcdefghikklmnopqrstuvwxyz" } }
服务器端发送与返回一致。
status - 状态 1成功,0异常
action - 方法
errcode - 错误号码
datas - 返回的内容,可以为空
server.py服务器接收到以后
投递到tcpstreampackage.py处理
搜索"length : " 得到长度,以后提取协议。然后对应action,以后反射得到协议对象。
部分代码
class TCPStreamPackage(object): def __init__(self , callback): super(TCPStreamPackage , self).__init__() self.datas = '' self._package_decode_callback = callback def add(self, data): #组包 if len(self.datas) == 0: self.datas = data else: self.datas = "%s%s" % (self.datas , data) #拆包 length = -1 length_index = self.datas.find('length\" :') if length_index != -1: length_end = self.datas.find(',' , length_index + 9 , length_index + 9 + 10) if length_end == -1: length_end = self.datas.find('}', length_index + 9 , length_index + 9 + 10) if length_end != -1: length = self.datas[length_index + 9 :length_end] if length != -1: length = int(length.strip()) if length != -1 and length <= len(self.datas): package = self.datas[0:length] package = FriendProtocol.checkPackage(package) if self._package_decode_callback: self._package_decode_callback(package) if len(self.datas) == length: self.datas = '' else: self.datas = self.datas[length]
解析协议
@staticmethod def checkPackage(package): json_msg = json.loads(package) protocol = { 'login' : PackageLogin , 'getfriendlistbytrainandtime' : PackageGetNotFriendsByCodeAndDate, 'addfriend' : PackageAddFriendRequest, 'addfriendstatus' : PackageAddFriendStatus, 'getfriends' : PackageGetFriends, 'delfriend' : PackageDeleteFriend, 'getfrienddetail' : PackageGetFriendDetail, 'sendchatmsg' : PackageSendChatMessage, 'register' : PackageRegister, } if json_msg.has_key("datas") : datas = json_msg['datas'] if datas.has_key('type') : stype = datas['type'] #存在协议内 if stype in protocol.keys(): #解析协议 pack = protocol[stype]() pack.parser(datas) return pack return None
相关文章推荐
- 用python写1个简单的聊天服务器7-业务处理
- 用python写1个简单的聊天服务器2-项目需求与服务器框架
- 用python写1个简单的聊天服务器8-version0.1收尾工作
- 用python写1个简单的聊天服务器3-TCP服务器选择
- Python中wsgi协议的服务器、简单处理wsgi服务器请求的框架
- 用python写1个简单的聊天服务器5-DB层处理
- 用python写1个简单的聊天服务器3-目录结构
- 用python写1个简单的聊天服务器-项目启动原因
- 用python写1个简单的聊天服务器6-用户模型
- 用python的twisted做个简单游戏服务器原形--客户端消息处理和重组类MessageQueue
- Python实现udp协议的简单服务器和客户端通信
- Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
- python3实现UDP协议的简单服务器和客户端
- python3实现UDP协议的简单服务器和客户端
- 初探基于TCP的服务器/客户端结构的聊天系统(二)之应用层通信协议设计
- Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
- 用Python建立最简单的web服务器
- python数字图像处理(10):图像简单滤波
- Python网络编程TCP服务器与客服端简单例子(调试通过)
- Python web 简单服务器的搭建与运行