# 聊天室 **Repository Path**: Kocola/ChatRoom ## Basic Information - **Project Name**: 聊天室 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-02-01 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 聊天室 版本:1.0.0 使用python2.7,制作一个游戏大厅,内容要求如下: 1. 客户端可以账户名、密码登陆进入游戏大厅 2. 可以注册新用户 3. 支持聊天,例如输入$chat haha,则大厅里其他人可以看到haha 4. 账户有在线时长的属性,需要存盘,下线再上不会丢失数据 5. 进阶需求: 1)有创建房间,进入房间,退出房间功能 2)支持多频道聊天,例如大厅,房间,私聊 3)小游戏:21点 a. 每个房间,每逢半点(8点半,9点,9点半等),会随机生成4个1到10内的数,发布在房间内,所有人可以看到; b. 玩家可以用+,-,*,/和括号,让4个数的计算结果尽量接近于21,但不能超过21; c. 玩家可以用聊天的方式,向服务端提供回答,例如: $21game (1+2)*(3+5)。只接受任意一个玩家第一次的回答,且此回答其他人看不到; d. 服务端发布问题后,15秒之内,如果有玩家的回答,刚好等于21,那么此玩家获胜,否则,计时结束时,计算结果最大的玩家获胜,如果有相同的答案,取第一个回答者; # 文件说明 1、client.py:客户端类,启动socket连接,输入命令,将命令封装成协议,接收服务器信息; 2、server.py:服务端类,启动socket,监听socket连接,处理客户端请求; 3、protocol.py:协议宏,用于标识协议号,客户端和服务端以此来封装和解析协议; 4、clientprotocol.py:客户端协议处理,包括错误码,命令解析,协议封装,协议解析; 5、messageutil.py:消息功能函数,包括消息的封装,解析,序列化和反序列化等; 6、user.py:用户类,封装和用户相关的信息(用户名,登录时间,在线时间等)及处理函数; 7、room.py:房间类,封装和房间相关的信息(房间名,房主,房间成员)及处理函数; 8、dbutil.py:数据库功能类,封装和数据库相关的操作; 9、game21.py:21点游戏模块,检查表达式合法性,玩家管理,判断获胜者等; # 命令说明 1、register:注册 2、login:登录 3、chat:发送消息给所有人 4、chatto:私聊 5、chatroom:房间聊天 6、queryroomlist:查询当前所有的房间信息 7、createroom:创建房间 8、enterroom:进入房间 9、leaveroom:离开房间 10、game21:21点游戏 11、logout:退出登录 # 命令用法 1、register+空格+用户名+空格+密码(用户名和密码不能包含空格,而且不能有多余的参数) 2、login+空格+用户名+空格+密码(用户名和密码不能包含空格,而且不能有多余的参数) 3、chat+空格+消息(消息可以有空格) 4、chatto+空格+用户名+消息(消息可以有空格) 5、chatroom+空格+消息(消息可以有空格) 6、queryroomlist(不可以有其它任何参数) 7、createroom+房间名(房间名可以有空格) 8、enterroom+空格+房间名(房间名可以有空格) 9、leaveroom(不可以有其它任何参数) 10、game21+空格+表达式 11、logout(不可以有其它任何参数) # 关于21点游戏 1、表达式不能有空格,表达式内容只能由如下构成:0-9数字,+,-,*,/,(,),此外,表达式必须合法,输入的数字必须是给定的数字; 2、为了方便测试,创建房间后,自动开始21点游戏,游戏间隔为10秒,单次游戏持续时间为180秒; 3、修改游戏间隔(server.py->_game21_interval),修改游戏持续时间(game21.py->self.__last_time); 4、房间解散后,该房间21点游戏会结束; # 关于用户在线时长 1、在server文件夹中,打开windows命令行,输入python dbutil.py即可获得所有用户的信息; # 其它 1、消息序列化和反序列化使用了python库中的pickle类; 2、为了避免粘包,数据包构成为:消息头+消息内容,消息头长度为4,包含消息内容的长度,接收数据时,需接收完毕指定长度的内容,同时避免了消息头的粘包问题; 3、在客户端中,主线程用于接收服务端发送的消息,输入命令和发送,是另开线程完成的; 4、在服务端中,21点游戏是另开线程完成,每次会遍历所有的房间,发送游戏内容; 5、用户在线时长,会在用户退出登录时在数据库中更新,在客户端意外推出时,也能做到更新,因此在用户在线时,查询的在线时长可能是其上一次退出登录时的数据; 6、命令参数之间或内容的空格数,在命令解析时,会自动变成一个,例如输入login空格空格netease1空格空格空格123空格,会自动转为:login空格netease1空格123; # 存在的问题 1、在windows命令行中,如果print的内容包含汉字,而且没有使用decode("utf-8")解码的话,会出现乱码,加上decode("utf-8")后,显示正常,但是,如果命令中包含汉字的话,会抛出异常,目前暂没有想法解决该问题,因此在命令中,不要包含中文字符;